标签:
求出满足条件的x的个数:gcd(x,a0) = a1 lcm(x,b0) = b1
我们不难得到gcd(x/a1,a0/a1) = 1 gcd(b1/x,b0/b1) = 1
以前上数论的时候讲过这道题,结果我没有去及时写,然后就不会做了。。。。暴搜其实也能拿80分。。。
参考了一下网上的题解,写得已经很清楚。
#include<cstdio> #define LL long long #define MAXN 50005 using namespace std; LL gcd(LL a,LL b) { if(b == 0) return a; else return gcd(b,a%b); } int cnt,prime[MAXN]; bool isprime[MAXN]; void init() { for(LL i = 2; i <= MAXN; i++) if(!isprime[i]) { prime[++cnt] = i; for(LL j = i*i; j <= MAXN; j+= i) isprime[j] = 1; } } int cal(int &x,int i) { int res = 0; while(x%i == 0) { res++; x /= i; } return res; } int n; int main() { int T; int a0,a1,b0,b1; scanf("%d",&T); init(); while(T--) { LL ans = 1; scanf("%d%d%d%d",&a0,&a1,&b0,&b1); for(int i = 1; i <= cnt; i++) { if(b1%prime[i] == 0) { int a0c = cal(a0,prime[i]); int a1c = cal(a1,prime[i]); int b0c = cal(b0,prime[i]); int b1c = cal(b1,prime[i]); if(a0c < a1c||b1c < b0c) ans = 0; else if(a0c == a1c&&b0c == b1c) { if(a1c <= b1c) ans *= (b1c - a1c+1); else ans = 0; } else if(a0c == a1c&&b0c < b1c)//至少大于只能 { if(a1c > b1c) ans = 0; } else if(a0c > a1c&&b0c == b1c)//只能大于至多 { if(a1c > b1c) ans = 0; } else if(a1c != b1c) ans = 0; } if(i == cnt && b1 > 1) prime[++cnt] = b1; if(ans == 0) break; } printf("%lld\n",ans); } }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/cqbzwja/article/details/47403437