JZOJ 4234 數學之神(phi模板)

題目大意

給出一個n,求phi(n)及2~n-1中與n互質的數的個數。

多組數據,T<=100000,n<=10000000
時間限制 1s
空間限制 256M

解題思路

互質的數個數爲phi(n)*n/2

#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#define maxn 10000000+6
#define fr(i,a,b) for(i=a;i<=b;i++)
using namespace std;
typedef long long ll;

int i,j,k,n,T;
ll pri[maxn],phi[maxn];
bool kan[maxn];
void pre(ll n)
{
    int tot=0;
    fr(i,2,n-1)
    {
        if (!kan[i])
        {
            pri[++tot]=i;
            phi[i]=i-1;
        }
        fr(j,1,tot)
        {
            ll k=i*pri[j];
            if (k>n) break;
            kan[k]=1;
            if (i%pri[j]==0)
            {
                phi[k]=phi[i]*pri[j];
                break;
            }
            else phi[k]=phi[i]*(pri[j]-1);

        }
    }
    return;
}
int main()
{
    scanf("%d",&T);
    pre(10000000);
    while (T--)
    {
        scanf("%d",&n);
        printf("%lld %lld\n",phi[n],phi[n]*n/2);
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章