/*
跟我念三遍:考虑端点!考虑端点!考虑端点!
题目的意思就是要么*2 要么*2-1 找规律之后发现其实是连着的 然后就可以递推出表达式,是连着的
啊.. 题目有坑,可是什么是坑(以后为了格式直接写网页里面.. 记事本排版太丑-.-)
(1)对于992B,很重要的就是最大公约数和最小公倍数。。。代码里都有(x)
copy别人的说明。。:
(参考https://blog.csdn.net/becky_w/article/details/80733056以及https://blog.csdn.net/Haipai1998/article/details/80737815)
题目大意,给你区间[l,r]和x,y 问你区间中有多少个数对 (a,b) 使得 gcd(a,b)=x lcm(a,b)=y
a,b交换位置就是不同的数对
1≤l,r≤1e9◂,▸1≤l,r≤1e9 and 1≤x,y<1e9◂,▸1≤x,y<1e9
题目分析,根据lcm(最小公倍数) 的定义 y=a*b/x;
也就是说 x∗y=a∗b◂=▸x∗y=a∗b
那么 ,我们发现a,b一定为Y的因数,所以我们枚举y的每个因子就可以,我们只要用log(y)的复杂度暴力算每一个因数就可以
然后对于每个因子当做a,
b=x*y/a;
然后判断a,b是否在区间内,gcd(a,b)是否为x
题意:求区间[L,R]内有多少对数,使得gcd(a,b)==x,lcm(a,b)==y. 其中L,R,a,b都已经给定. 如果中a==b只算一种
思路:既然是y的因数,可以在sqrt(y)的时间内处理出所有因数个数t(t很小),暴力t^2
关于因数个数很小的解释: 根据质因数分解唯一定理,每个质因数的幂次不会太大,因子总个数=(k1+1)*(k2+1)-----等等. 因此一个数的因子总个数不会太多.碰到类似和因子有关的内容直接暴力
但是自己写的时候遇到一点困难。。。
不想写了。。太懒了。。。。。
。。。。。。。。。。。。。打农药去了。。。。
18-7-9
}
快速幂参考 https://blog.csdn.net/dbc_121/article/details/77646508
#include
#include
#include
using namespace std;
typedef long long ll;
const ll modd = 1e9 + 7;
//a是底数,b是指数,mode是取模数,sum是记录取模的结果
long long Mode(long long a, long long b, long long mode)
{
long long sum = 1;
while (b) {
if (b & 1) {
sum = (sum * a) % mode;
b--;
}
b /= 2;
a = a * a % mode;
}
return sum;
}
int main(){
ll x; ll k;
while (cin >> x >> k) {
// k is the month;
//k is 1 我怎么把set和mod都忘了..
if (k == 0)cout << (2 * (x%modd) % modd)<
B题
#include
#include
#include
#include
using namespace std;
typedef long long ll;
const ll modd = 1e9 + 7;
ll a, b, x, y,l,r;
ll gcd(int a, int b)
{
if (a == 0) return b;
else
return gcd(b % a, a);
}
ll lcm(int a, int b)
{
return a * b / gcd(a, b);
}
bool check(ll a){//ll b, ll x, ll y) {
ll b = x * y / a;//【前面说的就是这里!】
//cout << endl;
//cout << "a " << a << endl;
//cout << "b " << b << endl;
//cout << gcd(a, b) << endl;
//cout << endl;
if (a > r || a < l)return false;
else if (b > r || b < l)return false;
else if (gcd(a, b) != x)return false;
//else if (lcm(a, b) != y)return false;
else return true;
}
int main(){
while (cin >> l >> r>>x>>y) {
ll ans = 0;
//mod 1 寻找质数 记得是i*i 以及要有等号!!
if (x == y) {
if (x > r || y < l)cout << "0" << endl;
else if (x > r || y < l)cout << "0" << endl;
else cout << "1" << endl;
return 0;
}
for (ll i = 1; i*i <= y; i++) {
if (y%i == 0) {//如果是0.. 那就是..
/*
//!!!!...
//a=y/i;
b = x * y / i;
//....... 小不忍则乱大谋.......
///......我能说什么.... 这样就忽略了 3 3这种
//因为自己和自己... 自己不会判断为自己的质数,所以判断不到,所以会少一种
//我:???? 7和7的因子是7 gcd也是7 ?????
//????如何想?
咦咦咦.. 代码断片了...
其实不是忽略了30 30 这种呀,面向数据编程但是没有找到症结所在
症结就是两个因子都有可能!
比如3 30这样,我们知道3,30可以,在30,3也加回来了, 然而5 6 这一对
注意到答案是不一样的,5和18不行,6和15可以,6被人为忽略了
很难发现吧。。 但是其实他们俩是不一样 的
cout << i <<" "<< b << endl;
if (check(i, b, x, y) == true) {
ans++;
if (i != b)ans++;
}
}*/
ll p = y / i;
//cout << "p " << p << endl;
//cout << "i " << i << endl;
if (check(i) == true)ans++;
if (p != i)
{
if (check(p) == true)ans++;
}
}
//为什么呢?因为不要给重复的?...
//test
//else if (y%i != 0);
}
cout << ans << endl;
}
return 0;
}