欧拉降幂公式—— BZOJ 3884 && FZU 1759

来源:互联网 发布:销售手机的软件 编辑:程序博客网 时间:2024/06/06 20:37

这里写图片描述


C - Super A^B mod C

Given A,B,C, You should quickly calculate the result of A^B mod C. (1<=A,C<=1000000000,1<=B<=10^1000000).

Input

    There are multiply testcases. Each testcase, there is one line contains three integers A, B and C, separated by a single space.

Output

For each testcase, output an integer, denotes the result of A^B mod C.

Sample Input

3 2 42 10 1000

Sample Output

124

只需利用欧拉公式降幂即可
#include<iostream>#include<string>#include<vector>#include<algorithm>#include<queue>#include<cstdio>#include<cstring>#include<cmath>#include<map>using namespace std;typedef long long ll;const int INF_INT  = 0x3f3f3f3f;const ll INF_LL  = 1e18;const int MOD=1e9 + 7;const int N = 100005;//int phi[N];//vector<int> prime;//void init()//{//    phi[1] = 1;//    for(int i=2;i<N;i++)//    {//        if(phi[i]==0)//        {//            prime.push_back(i);//            phi[i] = i-1;//        }//        for(int j=0;j<prime.size()&&prime[j]*i<N;j++)//        {//            if(i%prime[j]==0)//            {//                phi[i*prime[j]] = phi[i]*prime[j];//                break;//            }//            else//            {//                phi[i*prime[j]] = phi[i]*(prime[j]-1);//            }//        }//    }//}//计算欧拉函数O(sqrt(n))int Phi(int x){    int i,re=x;    for(i=2;i*i<=x;i++)        if(x%i==0)        {            re/=i;re*=i-1;            while(x%i==0)                x/=i;        }    if(x^1) re/=x,re*=x-1;    return re;}ll Quick_Power(ll x,ll y,ll p){    ll re=1;    while(y)    {        if(y&1) (re*=x)%=p;        (x*=x)%=p; y>>=1;    }    return re;}int Solve(int p){    if(p==1) return 0;    int phi_p = Phi(p);    return Quick_Power(2,Solve(phi_p)+phi_p,p);}int T,n,a,c;string b;int main(){    ios_base::sync_with_stdio(false);//    freopen("data.txt","r",stdin);    while(cin>>a>>b>>c)    {        int phi_c = Phi(c);        ll sum = 0;        for(int i=0;i<b.size();i++)        {            sum = (sum*10+b[i]-'0')%(phi_c);        }        cout <<Quick_Power(a,sum+phi_c,c)<<endl;    }}

BZOJ 3884 上帝与集合的正确用法

根据一些书上的记载,上帝的一次失败的创世经历是这样的:第一天,   上帝创造了一个世界的基本元素,称做“元”。第二天,   上帝创造了一个新的元素,称作“α”。“α”被定义为“元”构成的集合。容易发现,一共有两种不同的“α”。第三天,   上帝又创造了一个新的元素,称作“β”。“β”被定义为“α”构成的集合。容易发现,一共有四种不同的“β”。第四天,   上帝创造了新的元素“γ”,“γ”被定义为“β”的集合。显然,一共会有16种不同的“γ”。如果按照这样下去,上帝创造的第四种元素将会有65536种,第五种元素将会有2^65536种。这将会是一个天文数字。然而,上帝并没有预料到元素种类数的增长是如此的迅速。他想要让世界的元素丰富起来,因此,日复一日,年复一年,他重复地创造着新的元素……然而不久,当上帝创造出最后一种元素“θ”时,他发现这世界的元素实在是太多了,以致于世界的容量不足,无法承受。因此在这一天,上帝毁灭了世界。至今,上帝仍记得那次失败的创世经历,现在他想问问你,他最后一次创造的元素“θ”一共有多少种?上帝觉得这个数字可能过于巨大而无法表示出来,因此你只需要回答这个数对p取模后的值即可。你可以认为上帝从“α”到“θ”一共创造了10^9次元素,或10^18次,或者干脆∞次。

Input

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

Output

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

Sample Input

3236

Sample Output

014

Hint

对于100%的数据,T<=1000,p<=10^7

利用递归形式求解    

出题人题解

#include<iostream>#include<string>#include<vector>#include<algorithm>#include<queue>#include<cstdio>#include<cstring>#include<cmath>#include<map>using namespace std;typedef long long ll;const int INF_INT  = 0x3f3f3f3f;const ll INF_LL  = 1e18;const int MOD=1e9 + 7;const int N = 100005;//int phi[N];//vector<int> prime;//void init()//{//    phi[1] = 1;//    for(int i=2;i<N;i++)//    {//        if(phi[i]==0)//        {//            prime.push_back(i);//            phi[i] = i-1;//        }//        for(int j=0;j<prime.size()&&prime[j]*i<N;j++)//        {//            if(i%prime[j]==0)//            {//                phi[i*prime[j]] = phi[i]*prime[j];//                break;//            }//            else//            {//                phi[i*prime[j]] = phi[i]*(prime[j]-1);//            }//        }//    }//}//计算欧拉函数O(sqrt(n))int Phi(int x){    int i,re=x;    for(i=2;i*i<=x;i++)        if(x%i==0)        {            re/=i;re*=i-1;            while(x%i==0)                x/=i;        }    if(x^1) re/=x,re*=x-1;    return re;}ll Quick_Power(ll x,ll y,ll p){    ll re=1;    while(y)    {        if(y&1) (re*=x)%=p;        (x*=x)%=p; y>>=1;    }    return re;}int Solve(int p){    if(p==1) return 0;    int phi_p = Phi(p);    return Quick_Power(2,Solve(phi_p)+phi_p,p);}int T,n;string s;int main(){    ios_base::sync_with_stdio(false);//    freopen("data.txt","r",stdin);    cin>>T;    while(T--)    {        cin >> n;        cout <<Solve(n)<<endl;    }}
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 单位申报个税身份证号码填错怎么办 申报个税身份证号码填错了怎么办 办了人事代理联系函商调函怎么办 劳务公司与分包工头算账成怎么办 客户退保业务员己得保险佣金怎么办 投了简历公司打来电话没接到怎么办 跟老板要工资她说过几天怎么办 公路车弯把手小抓不到刹车怎么办 新手骑电动车上路车子一直晃怎么办 不知情收赃东西已经卖了怎么办 档案和派遣证不在同一个地方怎么办 档案缺招工表和派遣证怎么办退休 开发商对接的银行利息比较高怎么办 工作未满一年离职转正定级怎么办 被网络骗贷翻到几十万怎么办 面试通过后迟迟不通知入职怎么办 厂里捡到饭卡花了里面的钱怎么办 上班用自己手机打卡没电怎么办 逸尚考勤机显示超出考勤记录怎么办 下雨穿套裙工装上班好冷怎么办 蚂蚁借呗放款中不到账怎么办 护士电子化注册没有激活码怎么办? 地铁站务员入职体检身高差点怎么办 车子钥匙锁在车里了怎么办 打错账户了怎么办5天了 下岗失业人员在就业后档案怎么办 皮秒祛斑后没有敷面膜怎么办 硕士毕业工资好低不想工作怎么办 车卖了etc忘拿了怎么办 成熟卵泡打破卵针也不破怎么办? 深圳孩子户口挂别人名下上学怎么办 襄阳东风合运花园房贷怎么办下来 猫在外面躲起来找不到了怎么办 本科三批取消以后三本学校怎么办 机票名字多了个字母安检怎么办 出隧道口限速40超速了怎么办 社保交了五年后断交以后该怎么办 躺椅折叠椅坐的地方坏了怎么办 苹果手机锁频密码忘了怎么办 客户要货公司不给进怎么办 高铁23:00买的票怎么办