2721: [Violet 5]樱花
Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 580 Solved: 343
[ Submit][ Status][ Discuss]
Description
Input
Output
Sample Input
Sample Output
HINT
Source
升级版丢番图
线性筛素数之后求约数
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
#define mod 1000000007
#define LL long long
int N,cnt,pri[1000100],z[1000100];
bool flag[1000100];
LL ans=1;
void Getpri()
{
flag[1]=1; cnt=0;
for (int i=2; i<=N; i++)
{
if (!flag[i]) pri[++cnt]=i;
for (int j=1; j<=cnt && pri[j]*i<=N; j++)
{
flag[i*pri[j]]=1;
if (pri[j]%i==0) break;
}
}
}
void Calc(int x)
{
for (int i=pri[x]; i<=N; i+=pri[x])
for (int j=i; j%pri[x]==0; j/=pri[x]) z[x]++;
}
int main()
{
scanf("%d",&N); Getpri();
for (int i=1; i<=cnt; i++) Calc(i);
for (int i=1; i<=cnt; i++) ans=((LL)ans*(z[i]<<1|1)%mod)%mod;
printf("%lld\n",ans);
return 0;
}