zoukankan      html  css  js  c++  java
  • 【bzoj3884】上帝与集合的正确用法 【欧拉函数】

    题目传送门
    题解
    这道题其实就是一个欧拉函数的性质的应用:
    (a,m)=1a,m2,则aφ(m) mod m1
    我们设x=222...p=2kq(q,2)=1
    x mod p
    =2k(2xk mod q) mod p
    =2k(2(xk) mod φ(q)+φ(q) mod q) mod p
    我们令f(i,j)=(xi) mod j
    f(0,p)=2k(2f(k,φ(q))+φ(q) mod q) mod p
    于是我们只需要递归计算即可。当q=1就返回0
    答案就是f(0,p)
    代码

    #include<cstdio>
    #define int long long
    int t,p;
    int calcphi(int n){
        if(n==1||n==2){
            return 1;
        }
        int res=n;
        for(int i=2;i*i<=n;i++){
            if(n%i==0){
                res=res/i*(i-1);
                while(n%i==0){
                    n/=i;
                }
            }
        }
        if(n!=1){
            res=res/n*(n-1);
        }
        return res;
    }
    int fastpow(int a,int x){
        int res=1;
        while(x){
            if(x&1){
                res*=a;
            }
            x>>=1;
            a*=a;
        }
        return res;
    }
    int fastpow2(int a,int x,int mod){
        int res=1;
        while(x){
            if(x&1){
                res=res*a%mod;
            }
            x>>=1;
            a=a*a%mod;
        }
        return res;
    }
    int solve(int i,int j){
        if(j==1){
            return 0;
        }
        int u=0,tmp=j;
        while(!(tmp&1)){
            u++;
            tmp>>=1;
        }
        int phi=calcphi(tmp);
        return (fastpow(2,u)*(fastpow2(2,solve(u,phi)+phi,tmp)%tmp)%j-i%j+j)%j;
    }
    signed main(){
        scanf("%lld",&t);
        while(t--){
            scanf("%lld",&p);
            printf("%lld
    ",solve(0,p));
        }
        return 0;
    }
  • 相关阅读:
    函数式编程
    scala 有 + 运算符吗?
    使用 Idea 打 scala程序的 jar 包
    相见恨晚的 scala
    半夜思考,为什么 String 具有不变性
    我的常用
    DataTable学习笔记
    Js 操作cookie
    嵌套的 ajax 请求
    Jquery插件收集【m了慢慢学】
  • 原文地址:https://www.cnblogs.com/2016gdgzoi471/p/9476855.html
Copyright © 2011-2022 走看看