• 欧拉降幂


    看了那么多欧拉降幂的博客,都把理论说的通篇大论的,从费马定理什么的开始讲,但自从组队后,数论的东西都抛之脑后了,还好碰到一位良心博主,索性抛弃证明,直接给出方法和结论,甚是爽快。所以,我写个小笔记记录一蛤。

    欧拉降幂,在指数爆炸的时候,不得不将指数降降,这个降法,就是将指数取模于该模的欧拉数再加上该模的欧拉数。通俗讲就是,碰到a^b%c=a^(b%phi(c)+phi(c))%c,b>=phi(c);看到这个就不用管这个公式怎么来的了,(因为看了一会儿,看的头皮发麻)生命诚可贵,发量数不多。不管1加1是几,就拿例题过过手了。

    博客链接:https://blog.csdn.net/chenkunn/article/details/83792306

    样题:https://vjudge.net/problem/FZU-1759

    ac代码:

    #include<queue>
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    #include<iostream>
    #include<stack>
    #define MIN(x,y) ((x)<(y)?(x):(y))
    #define MAX(x,y) ((x)>(y)?(x):(y))
    using namespace std;
    typedef long long ll;
    ll phi(ll n)
    {
    	ll rec=n;
    	for(int i=2;i*i<=n;i++)
    	{
    		if(n%i==0)
    		{
    			rec=rec-rec/i;//这里看到一个秒懂的注释记录一下:同于rec*(1-1/i) 
    			while(n%i==0) n/=i;
    		}
    	}
    	if(n>1)	rec=rec-rec/n; 
    	return rec;
    }
    ll Pow(ll a,ll b,ll mod)
    {
    	ll rec=1;
    	while(b)
    	{
    		if(b&1)
    			rec=rec*a%mod;
    		a=a*a%mod;
    		b>>=1;
    	}
    	return rec;
    }
    int main()
    {
    	ll a,mod;
    	string b;
    	while(cin>>a>>b>>mod)
    	{
    		ll k=phi(mod);
    		ll len=b.size();
    		ll d=0;
    		for(int i=0;i<len;i++)
    			d=(d*10+b[i]-'0')%k;
    		d+=k;
    		cout<<Pow(a,d,mod)<<endl;
    	}
    	return 0;
    }
    

      

  • 相关阅读:
    Windows Phone 独立存储(IsolatedStorageFile) 简单
    Windows Phone HttpWebRequest 简单
    PHP register_shutdown_function函数详解 简单
    sap 系统参数设置
    记帐码: (posting key)
    FICO 面试题
    RFUMSV00 营业税预先申报
    零售业附加商品的应用
    FI 财务会计事务码
    ABAP MODIF ID 作用
  • 原文地址:https://www.cnblogs.com/wwq-19990526/p/11461356.html
Copyright © 2020-2023  润新知