安裝.net4.8提示已處理證書鏈,但不在受信任什麼
阿新 • • 發佈:2022-04-10
對於b很大這種情況,請使用尤拉降冪
首先介紹一下尤拉函式(此處用到一些網路資料)
同餘符號
含義
兩個整數a,b,若它們除以整數m所得的餘數相等,則稱a,b對於模m同餘
記作a≡b(mod m)
讀作a同餘於b模m,或讀作a與b關於模m同餘。
比如26≡14(mod 12)。
ll ol(ll n) { int rea=n; for(int i=2;i*i<=n;i++) { if(n%i==0) { rea=rea-rea/i; while(n%i==0) n/=i; } } if(n>1) rea=rea-rea/n; return rea; } int main() { ll a,b,c; cin>>a; cout<<ol(a)<<endl; }
可得知該數範圍內與這個數互質數的個數
尤拉降冪公式
由於我太弱這裡不做證明
上解題程式碼
#pragma GCC optimize(2) #pragma GCC optimize(3,"Ofast","inline") #include<iostream> #include<cstdio> #include<cstring> #include<queue> #include<algorithm> #include<map> #include<cmath> typedef long long ll; using namespace std; bool note; ll ol(ll n) { ll rea=n; for(ll i=2;i*i<=n;i++) { if(n%i==0) { rea=rea*(i-1)/i;while(n%i==0) n/=i; } } if(n>1) rea=rea*(n-1)/n; return rea; } ll jc(string bb,ll mod) { ll ans=0; for(ll i=0;i<bb.size();i++) { ans=ans*10+(bb[i]-'0'); if(ans>=mod) { ans%=mod;note=1; } } return ans; } ll km(ll a,ll b,ll c) { ll res=1; while(b) { if(b&1) res=(res*a)%c; a=(a*a)%c; b>>=1; } return res; } int main() { int sum;cin>>sum; while(sum--) { note=0; ll a,c; string b; cin>>a>>b>>c; ll cmod=ol(c); ll bb=jc(b,cmod); if(__gcd(a,c)!=1&¬e) bb+=cmod; cout<<km(a,bb,c)<<endl; } return 0; }
等我啥時候懂了再來補降冪證明(