zoukankan      html  css  js  c++  java
  • poj2154-color-polyan次二面体+欧拉函数优化

    N<=1e9,O(nlogn)的做法会超时。从枚举置换转变为枚举轮换长度,然后可以利用欧拉函数,把复杂度变为O(√n * logn)

     1 /*--------------------------------------------------------------------------------------*/
     2 
     3 #include <algorithm>
     4 #include <iostream>
     5 #include <cstring>
     6 #include <ctype.h>
     7 #include <cstdlib>
     8 #include <cstdio>
     9 #include <vector>
    10 #include <string>
    11 #include <queue>
    12 #include <stack>
    13 #include <cmath>
    14 #include <set>
    15 #include <map>
    16 
    17 //debug function for a N*M array
    18 #define debug_map(N,M,G) printf("
    ");for(int i=0;i<(N);i++)
    19 {for(int j=0;j<(M);j++){
    20 printf("%d",G[i][j]);}printf("
    ");}
    21 //debug function for int,float,double,etc.
    22 #define debug_var(X) cout<<#X"="<<X<<endl;
    23 #define LL long long
    24 const int INF = 0x3f3f3f3f;
    25 const LL LLINF = 0x3f3f3f3f3f3f3f3f;
    26 /*--------------------------------------------------------------------------------------*/
    27 using namespace std;
    28 
    29 int N,M,T;
    30 int MOD = 1e9+7;
    31 
    32 int Eular(int n)
    33 {
    34     int ans = n;
    35     for(int i=2;i*i<=n;i++)
    36     {
    37         if(n%i == 0)
    38         {
    39             ans -= ans/i;
    40             while(n%i == 0) n/= i;
    41         }
    42     }
    43     if(n>1) ans -= ans/n;
    44     return ans;
    45 }
    46 int pow_mod(int x,int cnt)
    47 {
    48     int base = x%MOD,res = 1;
    49     while(cnt)
    50     {
    51         if(cnt&1) {res *= base;res %= MOD;}
    52         base *= base;base %= MOD;
    53         cnt >>= 1;
    54     }
    55     return res;
    56 }
    57 
    58 int polya(int n,int m)
    59 {
    60     int res = 0;
    61     int i;
    62     for(i=1;i*i<n;i++)
    63     {
    64         if(n%i == 0)
    65         {
    66             res += Eular(i)%MOD * pow_mod(m,n/i-1)%MOD;res %= MOD;
    67             res += Eular(n/i)%MOD * pow_mod(m,i-1)%MOD;res %= MOD;
    68         }
    69     }
    70     if(i*i == n) res += Eular(i)%MOD*pow_mod(m,i-1)%MOD;
    71     return res%MOD;
    72 }
    73 
    74 int main()
    75 {
    76     scanf("%d",&T);
    77     while(T--)
    78     {
    79         scanf("%d%d",&N,&MOD);
    80         printf("%d
    ",polya(N,N));
    81     }
    82 }
  • 相关阅读:
    Ubuntu环境下NFS服务器搭建
    Node.js+koa2
    linux rhel7下安装python
    数据结构之链表
    0416. Partition Equal Subset Sum (M)
    0395. Longest Substring with At Least K Repeating Characters (M)
    1015. Smallest Integer Divisible by K (M)
    0227. Basic Calculator II (M)
    0337. House Robber III (M)
    0804. Unique Morse Code Words (E)
  • 原文地址:https://www.cnblogs.com/helica/p/5823656.html
Copyright © 2011-2022 走看看