刚才的T3
  • 板块学术版
  • 楼主AAA404
  • 当前回复5
  • 已保存回复5
  • 发布时间2023/1/1 17:47
  • 上次更新2023/10/24 05:53:32
查看原帖
刚才的T3
723198
AAA404楼主2023/1/1 17:47

这代码只有可怜的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就是几个数对,再加起来取模

2023/1/1 17:47
加载中...