zoukankan      html  css  js  c++  java
  • P4139 上帝与集合的正确用法[欧拉定理]

    题目描述

    [2^{2^{2cdots}} ~mod ~p ]

    简单题,指数循环节。

    由于当(b>=psi(p))时,有

    [a^b=a^{b ~mod~psi(p)+psi(p)} pmod p ]

    显然这道题满足这个条件。

    那当然是算(psi(p))然后(2^{2^{2cdots}})就可以变成

    [2^{2^{2^{2cdots}}}=2^{(2^{2^{2cdots}} ~mod~psi(p)+psi(p))} pmod p ]

    啦。

    往指数里头进行递归,每次算一个(psi(p'))即可(显然有解)。

    边界(p=1)时,显然式子(=0)

    参考代码

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    #include<string>
    #include<cstdlib>
    #include<queue>
    #include<vector>
    #define INF 0x3f3f3f3f
    #define PI acos(-1.0)
    #define N 101
    #define MOD 2520
    #define E 1e-12
    #define ll long long
    using namespace std;
    inline ll read()
    {
    	int f=1,x=0;char c=getchar();
    	while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
    	while(c>='0'&&c<='9'){x=x*10+c-'0';;c=getchar();}
    	return x*f;
    }
    inline int phi(int n)
    {
    	int ans=n;
    	for(int i=2;i<=sqrt(n);++i){
    		if(n%i==0){
    			ans=ans/i*(i-1);
    			while(n%i==0) n/=i;
    		}
    	}
    	if(n>1) ans=ans/n*(n-1);
    	return ans;
    }
    int p;
    inline ll qp(ll a,ll b,ll p)
    {
    	ll ans=1;
    	for(;b;b>>=1){if(b&1)ans=(ans*a)%p;a=(a*a)%p;}
    	return ans%p;
    }
    inline int dfs(ll x)
    {
    	if(x==1) return 0;
    	return qp(2,dfs(phi(x))+phi(x),x);
    }
    int main()
    {
    	int t;
    	t=read();
    	while(t--){
    		p=read();
    		printf("%lld
    ",dfs(p)%p);
    	}
    	return 0;
    } 
    
  • 相关阅读:
    sql事务
    连续按两次提示退出功能
    页面跳转及传值
    TextView详解
    textAppearance的属性设置
    POJ-1459 Power Network
    POJ-2112 Optimal Milking
    POJ-1149 PIGS
    AOJ-722 发红包
    HDU-3605 Escape
  • 原文地址:https://www.cnblogs.com/DarkValkyrie/p/11740668.html
Copyright © 2011-2022 走看看