Time Limit: 5 Sec Memory Limit: 128 MB
Description
/**************************************************************
Problem: 2721
User: ictsing
Language: C++
Result: Accepted
Time:384 ms
Memory:13984 kb
****************************************************************/
//BZOJ2721 [Violet 5]樱花
#include <iostream>
#include <cstdio>
using namespace std;
const int mt = 1000000+5;
const int mod = 1e9+7;
typedef long long ll;
bool vis[mt];
int mn[mt],pri[mt];
int cnt=0;
inline int read()
{
int num=0,flag=1;
char ch;
do{
ch=getchar();
if(ch=='-') flag=-1;
}while(ch<'0'||ch>'9');
do{
num=num*10+ch-'0';
ch=getchar();
}while(ch>='0'&&ch<='9');
return num*flag;
}
void getphi(int x)
{
for(int i=2;i<=x;i++)
{
if(!vis[i]) pri[++cnt]=i,mn[i]=cnt;
for(int j=1;j<=cnt&&pri[j]*i<=x;j++)
{
vis[pri[j]*i]=1,mn[pri[j]*i]=j;
if(i%pri[j]==0) break;
}
}
}
int num[mt];
void cal(int x)
{
while(x>1)
{
num[mn[x]]++;
x/=pri[mn[x]];
}
}
int main()
{
int n=read();
getphi(n);
for(int i=1;i<=n;i++)
cal(i);
ll ans=1;
for(int i=1;i<=cnt;i++)
ans=ans*(num[i]*2+1)%mod;
printf("%lld\n",ans);
return 0;
}
评论