D. The Number of Pairs
题目传送门:
题目大意:
给你三 个数c,d,x,要你找到有多少对数满足 c * lcm(a,b) - d * gcd(a,b) = x
思路:
AC Code
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=2e7+10;
int primes[N],ans[N],cnt;
int p[N];
LL res=0;
LL quick_pow(LL a,LL b)
{
LL ans=1;
while(b)
{
if(b%2) ans=ans*a;
a=a*a;
b=b/2;
}
return ans;
}
void solve(int x)
{
res+=quick_pow(2,p[x]);
}
int main()
{
int t;
scanf("%d",&t);
for(int i=2;i<N;i++)
{
if(ans[i]==0)
{
primes[++cnt]=i;
p[i]=1;
}
for(int j=1;j<=cnt&&primes[j]*i<N;j++)
{
ans[primes[j]*i]=1;
if(i%primes[j]==0)
{
p[primes[j]*i]=p[i];
break;
}
else p[primes[j]*i]=p[i]+1;
}
}
while(t--)
{
LL c,d,x;
scanf("%lld%lld%lld",&c,&d,&x);
res=0;
for(LL i=1;i<=sqrt(x);i++)
{
if(x%i) continue;
if((i+d)%c==0) solve((i+d)/c);
if((x/i+d)%c==0&&i!=x/i) solve((x/i+d)/c);
}
printf("%lld\n",res);
}
//system("pause");
return 0;
}
感觉这种题目充满了套路但是又不乏思维,数学的题目还是练的太少了。这题也顺便也让我学会了n个数如何快速求得每个数可以分解为多少个不同的质因子。