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;
    }
  • 相关阅读:
    JDK动态代理源码解析
    Drools规则引擎-判断集合(List)是否包含集合
    Drools规则引擎-memberOf操作
    我对于今目标的反思
    UltraEdit的配置
    演讲的注意事项
    原型的安装及使用
    java异常的一些小知识
    网络攻击技术开篇——SQL Injection
    机房重构之接口
  • 原文地址:https://www.cnblogs.com/2016gdgzoi471/p/9476855.html
Copyright © 2011-2022 走看看