标签:公倍数 clu 证明 因此 mat 一个 turn ima ret
原题链接 https://www.luogu.org/problemnew/show/P1072
这个题是数论+暴力吧,需要一些优化。
先来看看怎么求最大公约数和最小公倍数:
#include<iostream> #include<cstdio> #include<cmath> using namespace std; int read() { char ch=getchar(); int a=0,x=1; while(ch<‘0‘||ch>‘9‘) { if(ch==‘-‘) x=-x; ch=getchar(); } while(ch>=‘0‘&&ch<=‘9‘) { a=(a<<3)+(a<<1)+(ch-‘0‘); ch=getchar(); } return x*a; } int t; int a0,a1,b0,b1,ans; int gcd(int a,int b) { if(b==0) return a; else return gcd(b,a%b); } int main() { t=read(); for(int i=1;i<=t;i++) { ans=0; a0=read(); //x和a0的最大公约数是a1 a1=read(); //gcd(x,a0)=a1 b0=read(); //x和b0的最大公约数是b1 b1=read(); //x*b0=b1*gcd(x,b0) => x=b*gcd(x,b0) int b=b1/b0; for(int i=1;i<=sqrt(b1);i++) //枚举到sqrt(b1)就行了 { if(b1%i==0) { if(gcd(i,a0)==a1&&b*gcd(i,b0)==i) ans++; int j=b1/i; if(i!=j) { if(gcd(j,a0)==a1&&b*gcd(j,b0)==j) ans++; } } } printf("%d\n",ans); } return 0; }
标签:公倍数 clu 证明 因此 mat 一个 turn ima ret
原文地址:https://www.cnblogs.com/xcg123/p/11017519.html