这代码只有可怜的5pts,个人感觉做法没错,路过大佬帮忙看下
#include<bits/stdc++.h>
using namespace std;
const long long MAXN=1e7;
const long long MOD=1e9+7;
long long T;
int aa[10000001];
bool vis[10000001];
inline long long read()
{
char ch=getchar();long long s=0,w=1;
while(ch<'0' || ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0' && ch<='9'){s=s*10+ch-48;ch=getchar();}
return s*w;
}
void get()
{
for(int i=1;i<=MAXN;i++)
{
for(int j=1;i*j<=MAXN;j++)
{
aa[i*j]++;
}
}
}
int main()
{
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
get();
T=read();
for(int i=1;i<=T;i++)
{
long long k=read(),P=read(),Q=read(),ans=0;
for(long long j=P;j<=Q;j++)
{
long long a=j*j*k;
if(aa[a]&1)ans+=(aa[a]>>1)+1;
else ans+=(aa[a]>>1);
ans%=MOD;
}
printf("%lld\n",ans);
}
return 0;
}
思路是gcd(x,y)^2*k=xy,筛一遍因数个数,枚举gcd(x,y)从P到Q把所有因数个数除以2就是几个数对,再加起来取模