题意:
就是给你多组测试样例,每次给你a0,a1,b0,b1,让你找出有多少不同的x,满足gcd(a0,x)=a1并且lcm(b0,x)=b1。T = 2000,1≤a0,a1,b0,b1≤2∗1e9。
思考:
代码:
#include
#define fi first
#define se second
#define pb push_back
#define db double
#define int long long
#define PII pair<int,int >
#define mem(a,b) memset(a,b,sizeof(a))
#define IOS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
using namespace std;
const int mod = 1e9+7,inf = 1e18;
const int N = 2e5+10,M = 4e5+10;
int T,n,m,k;
PII va[N];
int vb[N];
int pri[M],st[M];
int cnt,cnt1,cnt2;
void init(int x)
{
for(int i=2;i<=x;i++)
{
if(!st[i]) pri[++cnt] = i;
for(int j=1;pri[j]*i<=x;j++)
{
st[pri[j]*i] = 1;
if(i%pri[j]==0) break;
}
}
}
void dfs(int now,int sum)
{
if(now>cnt1)
{
vb[++cnt2] = sum;
return ;
}
int res = 1;
for(int i=0;i<=va[now].se;i++)
{
dfs(now+1,sum*res);
res *= va[now].fi;
}
}
int gcd(int a,int b)
{
if(!b) return a;
return gcd(b,a%b);
}
int lcm(int a,int b)
{
return a/gcd(a,b)*b;
}
signed main()
{
IOS;
init(4e5+5);
//由于分解质因数或者找因子都是根号下n的复杂度
//所以这里晒的时候只要晒根号下n就可以了,对于大的质数就剩下一个了
//因为如果是两个的话大于4e5的质数的平方>1e9了都.
cin>>T;
while(T--)
{
int a0,a1,b0,b1;
cin>>a0>>a1>>b0>>b1;
cnt1 = 0;cnt2 = 0;int tmp = b1;
for(int i=1;pri[i]<=tmp/pri[i];i++)
{
int res = 0;
while(tmp%pri[i]==0)
{
res++;
tmp /= pri[i];
}
va[++cnt1] = {pri[i],res};
}
if(tmp>1) va[++cnt1] = {tmp,1};
dfs(1,1);
int ans = 0;
for(int i=1;i<=cnt2;i++)
{
if(lcm(b0,vb[i])==b1&&gcd(a0,vb[i])==a1) ans++;
}
cout<<ans<<"\n";
}
return 0;
}
总结:
以后最好搞懂那些优化复杂度的各种算法。