zoukankan      html  css  js  c++  java
  • POJ 2154 Color

    思路

    思路就是这个题

    注意POJ数据较强,算phi需要预处理质因数,然后不能define int long long否则会TLE
    还要注意P不一定是质数,所以分子要先除掉n

    代码

    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    #include <cmath>
    using namespace std;
    int n,p,t,ans=0,cnt,isprime[100100],iprime[100100];
    int pow(int a,int b){
        int ans=1;
        while(b){
            if(b&1)
                ans=(1LL*ans*a)%p;
            a=(1LL*a*a)%p;
            b>>=1;
        }
        return ans;
    }
    void prime(int n){
        isprime[1]=true;
        for(int i=2;i<=n;i++){
            if(!isprime[i]){
                iprime[++cnt]=i;
            }
            for(int j=1;j<=cnt&&iprime[j]*i<=n;j++){
                isprime[iprime[j]*i]=true;
                if(i%iprime[j]==0)
                    break;
            }
        }
    }
    int get_phi(int x){
        int ans=x;
        for(int i=1;1LL*iprime[i]*iprime[i]<=x;i++){
            if(x%iprime[i]==0){
                ans=1LL*ans/iprime[i]*(iprime[i]-1);
                while(x%iprime[i]==0)
                    x/=iprime[i];
            }
        }
        if(x!=1)
            ans=1LL*ans/x*(x-1);
        return ans;
    }
    signed main(){
        scanf("%d",&t);
        prime(32000);
        while(t--){
            scanf("%d %d",&n,&p);
            ans=0;
            int i=0;
            for(i=1;i*i<n;i++){
                if(n%i==0){
                    ans=(ans+1LL*pow(n,i-1)*get_phi(n/i)%p+1LL*pow(n,n/i-1)*get_phi(i)%p)%p;
                }
            }
            if(i*i==n)
                ans=(ans+1LL*pow(n,i-1)*get_phi(i)%p)%p;
            printf("%d
    ",ans);
        }
        return 0;
    }
    
  • 相关阅读:
    POJ2559/HDU1506 Largest Rectangle in a Histogram (cartesian tree)
    POJ2201 Cartesian Tree (cartesian tree)
    一本通1007
    一本通1006
    一本通1005
    一本通1004
    一本通1003
    一本通1002
    一本通1001
    一本通1000
  • 原文地址:https://www.cnblogs.com/dreagonm/p/10596357.html
Copyright © 2011-2022 走看看