zoukankan      html  css  js  c++  java
  • [bzoj3884]上帝与集合的正确用法

    这道题需要用到扩展欧拉定理,即$a^{b}\equiv a^{b\ mod\ \phi(m)+\phi(m)}(mod\ \phi(m))$

    不断递归计算,奇数的phi值一定是偶数,偶数的phi值一定会除以2,即log次递归

    还有phi可以用线性筛计算,也可以在线计算(复杂度分别是$o(p+Tlog^{2}p)$和$o(Tlogp\sqrt{p})$)

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define N 10000005
     4 int t,n,vis[N],phi[N],p[N];
     5 int ksm(int n,int p){
     6     if (!n)return 1;
     7     int s=ksm(n>>1,p);
     8     s=1LL*s*s%p;
     9     if (n&1)s=s*2%p;
    10     return s;
    11 }
    12 int dfs(int k,int p){
    13     if (p==1)return 0; 
    14     return ksm(dfs(k-1,phi[p])+phi[p],p);
    15 }
    16 int main(){
    17     phi[1]=1;
    18     for(int i=2;i<N-4;i++){
    19         if (!vis[i]){
    20             p[++p[0]]=i;
    21             phi[i]=i-1;
    22         }
    23         for(int j=1;(j<=p[0])&&(i*p[j]<N-4);j++){
    24             vis[i*p[j]]=1;
    25             if (i%p[j]==0){
    26                 phi[i*p[j]]=phi[i]*p[j];
    27                 break;
    28             }
    29             phi[i*p[j]]=phi[i]*(p[j]-1);
    30         }
    31     }
    32     scanf("%d",&t);
    33     while (t--){
    34         scanf("%d",&n);
    35         printf("%d\n",dfs(1e9,n));
    36     }
    37 }
    View Code
  • 相关阅读:
    linux常用命令
    10.8统计英文词频
    9月10号作业
    华氏温度与摄氏温度转换
    小故事
    Java的工厂模式(三)
    Javascript实现图片翻转
    Java的工厂模式(二)
    Java的工厂模式(一)
    Java新建线程的两种方式
  • 原文地址:https://www.cnblogs.com/PYWBKTDA/p/11458896.html
Copyright © 2011-2022 走看看