zoukankan      html  css  js  c++  java
  • 扩展欧拉定理【p4139】上帝与集合的正确用法

    Description

    根据一些书上的记载,上帝的一次失败的创世经历是这样的:

    第一天, 上帝创造了一个世界的基本元素,称做“元”。

    第二天, 上帝创造了一个新的元素,称作“α”。“α”被定义为“元”构成的集合。容易发现,一共有两种不同的“α”。

    第三天, 上帝又创造了一个新的元素,称作“β”。“β”被定义为“α”构成的集合。容易发现,一共有四种不同的“β”。

    第四天, 上帝创造了新的元素“γ”,“γ”被定义为“β”的集合。显然,一共会有16种不同的“γ”。

    如果按照这样下去,上帝创造的第四种元素将会有65536种,第五种元素将会有2^65536种。这将会是一个天文数字。

    然而,上帝并没有预料到元素种类数的增长是如此的迅速。他想要让世界的元素丰富起来,因此,日复一日,年复一年,他重复地创造着新的元素……

    然而不久,当上帝创造出最后一种元素“θ”时,他发现这世界的元素实在是太多了,以致于世界的容量不足,无法承受。因此在这一天,上帝毁灭了世界。

    至今,上帝仍记得那次失败的创世经历,现在他想问问你,他最后一次创造的元素“θ”一共有多少种?

    上帝觉得这个数字可能过于巨大而无法表示出来,因此你只需要回答这个数对p取模后的值即可。

    你可以认为上帝从“α”到“θ”一共创造了(10^9)次元素,或(10^{18})次,或者干脆(infty)

    One word.

    (2^{2^{2^{....}}}mod p)

    Input

    第一行一个整数(T),表示数据个数。

    接下来(T)行,每行一个正整数(p),代表你需要取模的值

    Output

    (T)行,每行一个正整数,为答案对(p)取模后的值

    直接套公式即可,证明的话目前在准备(Noip),将来证明.

    [a^x equiv a^{x mod phi(m) +phi(m)} (mod m) ]

    所以这里递归求解即可.

    (phi())的话.我没有用线性筛求,选择了

    [phi(x)=x imes prod_{i=1}^{r} (1-frac{1}{p_1}) ]

    这里的(p)为质数.

    代码

    #include<cstdio>
    #include<cctype>
    #define R register
    #define int long long
    using namespace std;
    inline void in(int &x)
    {
    	int f=1;x=0;char s=getchar();
    	while(!isdigit(s)){if(s=='-')f=-1;s=getchar();}
    	while(isdigit(s)){x=x*10+s-'0';s=getchar();}
    	x*=f;
    }
    inline int phi(int x)
    {
    	int res=x;
    	for(R int i=2;i*i<=x;i++)
    	{
    		if(x%i==0)
    		{
    			res=res/i*(i-1);
    			while(x%i==0)x/=i;
    		}
    	}
    	if(x>1)res=res/x*(x-1);
    	return res;
    }
    int T;
    inline int ksm(int x,int y,int p)
    {
    	int res=1;
    	for(;y;y>>=1,x=x*x%p)
    		if(y&1)res=res*x%p;
    	return res;
    }
    inline int calc(int x)
    {
    	if(x==1)return 0;
    	return ksm(2,calc(phi(x))+phi(x),x);
    }
    signed main()
    {
    	in(T);
    	for(R int x;T;T--)
    	{
    		in(x);
    		printf("%lld
    ",calc(x));
    	}
    }
    
  • 相关阅读:
    Java设计模式——单例模式
    重新学习MyBatis-逆向工程
    重新学习MyBatis(六)
    重新学习MyBatis(五)
    重新学习Mybatis(四)
    重新学习MyBatis(三)
    重新学习Mybatis(二)
    Java设计模式重新出发
    回归问题常用的损失函数总结
    Matlab绘图局部放大
  • 原文地址:https://www.cnblogs.com/-guz/p/9786376.html
Copyright © 2011-2022 走看看