樱花(素数筛+整数唯一分解)

原题见洛谷。

首先可以化成这样的形式:\small (x-N^2)(y-N^2)=(N!)^2

然后对于N!的质因子分解应该不是难事,可以很快得到每个质因子的次数。由于有个平方,右边的次数还要乘2。

左边可以完全不管内容,只是把它当作两个数a,b相乘。于是a,b相乘后,每个质因子次数之和,分别等于N!每个质因子的次数乘2,直接扫一遍乘完就行。

#include<cstdio>
using namespace std;
typedef long long LL;
const LL mod=1000000007;
const int MAXN=1000000;
int N,vis[MAXN+5],tot=0,cnt[MAXN];
LL prime[MAXN];

void get_prime()
{
	for(int i=2;i<=N;i++)
	{
		if(!vis[i]) prime[++tot]=i;
		for(int j=1;j<=tot&&prime[j]*i<=N;j++)
		{
			vis[prime[j]*i]=1;
			if(i%prime[j]==0) break;
		}
	}
}

void solve()
{
	for(int i=1;i<=tot;i++)
		for(LL j=prime[i];j<=N;j*=prime[i])
			cnt[i]+=N/j;
	 
	LL ans=1;
	for(int i=1;i<=tot;i++) ans=(ans*(cnt[i]*2+1))%mod;
	printf("%lld",ans);
}

int main()
{
	scanf("%d",&N);
	get_prime();
	solve();
	return 0;
}

猜你喜欢

转载自blog.csdn.net/WWWengine/article/details/82320066