| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
Re:结果数据得用__int64,AC。In Reply To:结果数据得用__int64,AC。 Posted by:yufuwan1 at 2008-08-11 10:50:53 >
ft
线性筛素数,线性求欧拉函数值,再累加!
#include<iostream>
#include<string.h>
using namespace std;
#define Max 1000001
bool flag[Max];int prime[80000],a[Max];
int p_num,i,j,n;__int64 b[Max];
void getP()
{ p_num = 0;
memset(flag,false, sizeof(flag) );
for ( i = 2; i < Max; i++ )
{
if ( !flag[i] ) prime[p_num++] = i;
for ( j = 0; j < p_num && i * prime[j] < Max; j++ )
{
flag[ i * prime[j] ] = true;
if ( i % prime[j] == false )
break;
}
}
a[0]=a[1]=0;
for(i=2;i<Max;i++)
{if(!flag[i]) a[i]=i-1;
else
{ for(j=0;j<p_num;++j)
if(i%prime[j]==0) break;
if((i/prime[j])%prime[j]==0) a[i]=a[i/prime[j]]*(prime[j]);
else a[i]=a[i/prime[j]]*(prime[j]-1);
}
}
memset(b,0,sizeof(b));
for(i=2;i<Max;i++)
b[i]=a[i]+b[i-1];
}
int main()
{ getP();
while(scanf("%d",&n))
{if(n==0) break;
printf("%I64d\n",b[n]);
}
system("pause");
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator