bzoj 2721: [Violet 5]樱花 (线性筛+质因数分解)

来源:互联网 发布:淘宝联盟分享能赚钱吗 编辑:程序博客网 时间:2024/05/18 03:36

2721: [Violet 5]樱花

Time Limit: 5 Sec  Memory Limit: 128 MB
Submit: 536  Solved: 317
[Submit][Status][Discuss]

Description

Input

Output

Sample Input

Sample Output

HINT

Source

interviewstreet--EQUATIONS

[Submit][Status][Discuss]

题解:线性筛+质因数分解

这道题的答案是(n!)^2的约数个数,然而我并不知道为什么,找了1个多小时的规律。。。。。

还是说一下靠谱的做法吧。

设n!=z,y=z+d

1/x+1/y=1/z  =>  1/x+1/(z+d)=1/z

(x+z+d)/(x*z+x*d)=1/z

z*(x+z+d)=x*z+d*z

z^2+d*z=d*x

x=z^2/d+z 因为x是正整数,所以d是z^2的因数。。。。

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#define N 1000003#define p 1000000007#define LL long longusing namespace std;int n,prime[N],mp[N],num[N],pd[N];void init(){for (int i=2;i<=1000000;i++) {if (!pd[i]) prime[++prime[0]]=i,mp[i]=prime[0];for (int j=1;j<=prime[0];j++){if (i*prime[j]>1000000) break;pd[i*prime[j]]=1;if (i%prime[j]==0) break;}}}void calc(int x,int val){int k=x;for (int i=1;prime[i]*prime[i]<=k;i++) if (k%prime[i]==0) { while (k%prime[i]==0) num[i]++,k/=prime[i]; }if (k>1) num[mp[k]]++;}int main(){init(); scanf("%d",&n);for (int i=1;i<=n;i++) calc(i,1);LL ans=1;for (int i=1;i<=prime[0];i++)  ans=ans*(LL)(num[i]*2+1)%p;printf("%I64d\n",ans);}



0 0
原创粉丝点击