LG-P1445 [Violet]樱花

P1445 [Violet]樱花
题目背景
我很愤怒

题目描述
求方程 1/X+1/Y=1/(N!) 的正整数解的组数,其中N≤10^6。

解的组数,应模1e9+7。

输入格式:
输入一个整数N

输出格式:
输出答案

输入样例:
1439
输出样例:
102426508

题解:
由 于 1 x + 1 y = 1 n ! 且 x , y 都 是 正 整 数 由于\frac 1x +\frac 1y = \frac 1{n!} 且x,y都是正整数 x1+y1=n!1x,y

所 以 x , y > n !      我 们 设 y = n ! + k 所以 x,y >n!\ \ \ \ 我们设y=n!+k x,y>n!    y=n!+k

则 1 x + 1 n ! + k = 1 n ! 则\frac1x+\frac1{n!+k}=\frac1{n!} x1+n!+k1=n!1

x + n ! + k x ∗ ( n ! + k ) = 1 n ! \frac{x+n!+k}{x*(n!+k)}=\frac1{n!} x(n!+k)x+n!+k=n!1

x ∗ ( n ! + k ) = n ! ∗ ( x + n ! + k ) x*(n!+k)=n!*(x+n!+k) x(n!+k)=n!(x+n!+k)

x ∗ k = ( n ! ) 2 + k ∗ n ! x*k=(n!)^2+k*n! xk=(n!)2+kn!

x = ( n ! ) 2 k + n ! x=\frac{(n!)^2}k+n! x=k(n!)2+n!

因 为 x 为 正 整 数 , 所 以 k 定 为 ( n ! ) 2 的 约 数 因为x为正整数,所以k定为(n!)^2的约数 xk(n!)2

同 时 , 对 于 每 一 个 ( n ! ) 2 的 约 数 a , 都 能 求 出 一 对 符 合 条 件 的 x , y 同时,对于每一个(n!)^2的约数a,都能求出一对符合条件的x,y (n!)2axy

质 因 数 拆 分 来 求 约 数 个 数 。 质因数拆分来求约数个数。

代码

#include<bits/stdc++.h>
using namespace std;
const int tt=1e9+7,maxn=1e6+5;
typedef long long LL;
int n,vis[maxn],p[maxn];
void count(int p,int &k)
{
	int m=n;k=0;
	while (m) k+=m/=p;
}
int main()
{
	scanf("%d",&n);
	for (int i=2;i<=n;++i)
	{
		if (!vis[i]) p[++p[0]]=i;int ed=n/i;
		for (int j=1;j<=p[0]&&p[j]<=ed;++j)
		{
			vis[p[j]*i]=1;
			if (i%p[j]==0) break;
		}
	}
	int k;LL ans=1;
	for (int i=1;i<=p[0];++i)
	{
		count(p[i],k);k=k<<1|1;
		if ((ans*=k)>=tt) ans%=tt;
	}
	printf("%lld",ans);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值