POJ 3090 欧拉函数 打表

由给出的样例可以看出  记结果为f(n);

当n=1时 显然f(n)=3;

当n=2时  f(n)=2*( \phi (2))+3;

当n=3时 f(n)=2(\phi (2)+\phi (3))+3;

当n=4时 f(n)=2*(\phi (2)+\phi (3)+\phi (4))+3

.............

从这些可以看出规律

代码:

#include <set>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <functional>
#define PI acos(-1)
typedef long long ll;
using namespace std;
const int INF = 0x3f3f3f3f;
const ll N=1000+10;
ll prime[N];
ll phi[N]={0,1};
ll judge[N]={1,1};
ll num_prime=0;
void init()
{
   for(ll i=2;i<N;i++)
   {
      if(judge[i]==0)
      {
         prime[num_prime++]=i;
         phi[i]=i-1;
	  }
	  for(ll j=0;j<num_prime&&i*prime[j]<N;j++)
	  {
	      judge[i*prime[j]]=1;
	      if(i%prime[j]==0)
	      {
	         phi[i*prime[j]]=phi[i]*prime[j];
	         break;
		  }
		  phi[i*prime[j]]=phi[i]*(prime[j]-1);
	  }
   }
   for(ll i=3;i<N;i++)
      phi[i]=phi[i-1]+phi[i];
      phi[1]=0;
}
int main()
{
    ll t,n;
    init();
    scanf("%lld",&t);
    ll cas=0;
    while(t--)
    {
       cas++;
	   scanf("%lld",&n);
       printf("%lld %lld ",cas,n);
       printf("%lld\n",2*phi[n]+3);
	}
} 

猜你喜欢

转载自blog.csdn.net/jun_____/article/details/82141945