日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

POJ-1845 数论

發(fā)布時間:2023/12/10 编程问答 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 POJ-1845 数论 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

題意就是輸入 a,b 輸出 a的b次方的因子求和并對9902 取模


這題可以對因子化簡

由于唯一分解定理 可以把a(bǔ)表示成 p1^q1*p2^q2...*pn^qn

也就是說 a^b =?p1^(q1*b)*p2^(q2*b)...*pn^(qn*b)

由于約數(shù)和公式可得a^b得約數(shù)求和為(1+p1+p1^2+p1^3+...p1^(q1*b))(1+p2+p2^2+p2^3+...p2^(q2*b))...(1+pn+pn^2+pn^3+...pn^(qn*b))

故問題轉(zhuǎn)化成了如何求等比數(shù)列得問題

我們再看?1+p1+p1^2+p1^3+...p1^(q1*b) 可以對其因式分解 從而簡化計算

若q*b是偶數(shù) 那么一共為奇數(shù)項 最終可以化簡為 (1+p^(n/2+1) )*(1+p+p^2+...p^(n/2-1))+p^(n/2)

若q*b是奇數(shù) 那么一共為偶數(shù)項 化簡為--> (1+p+p^2+...p^(n/2)*(1+p^(n/2+1))

其中都可以利用一個二分的思想 就是把數(shù)列拆開來算


code:

#include<iostream> #include<cstdio> #include<cmath> #include<vector> using namespace std; typedef long long ll;const int maxn = 50000000; const int mod = 9901; vector<int>p; int size,a,b; bool vis[20005]; void prime() {for(int i=2;i*i<=maxn;i++){if(!vis[i]){p.push_back(i);for(int j=i+i;j*j<=maxn;j+=i)vis[j]=1;}} } ll fun(ll aa,ll bb) {ll ans = 1;aa%=mod;while(bb){if(bb&1)ans = ans*aa %mod;bb>>=1;aa = aa*aa%mod;}return ans%=mod; } ll bi(ll x,ll n) {if(n==0)return 1;else{if(n%2)return (bi(x,n/2)*( 1 + fun(x,n/2+1 ) ))%mod;else return ( bi(x,n/2-1)*( 1 + fun(x,n/2+1 ) )+fun(x,n/2))%mod;} } ll solve() {ll ans=1; ll t = a;for(int i=0;p[i]*p[i]<=a;i++){ll tem =0; //cout<<p[i]<<endl;//system("pause");while(t%p[i]==0)tem++,t/=p[i];tem*=b;ans*=bi(p[i],tem),ans%=mod; }if(t!=1)ans*= bi(t,b)%mod,ans%=mod;return ans%mod; }int main() {ios::sync_with_stdio(0);prime();cin>>a>>b;if(b==0||a<=1)cout<<1<<endl;else cout<<solve()<<endl;return 0; }
? #include<iostream> #include<cstdio> using namespace std; const int maxn = 50000000; const int lim = 10005; const int mod = 9901; typedef long long ll; ll a,b,p[lim],sze; bool vis[50005]; void prime() {for(int i=2;i<50005;i++){if(!vis[i]){p[sze++] = i;for(int j=i+i;j<50005;j+=i)vis[j]=1;}} } ll fun(ll aa,ll bb,ll m) {ll ans = 1;aa%=m;while(bb){if(bb&1)ans = ans*aa%m;bb>>=1;aa = aa*aa%m;}return ans%m; } ll solve() {ll ans=1;ll c =a;for(int i=0;p[i]*p[i]<=c;i++){ll tem =0;while(c%p[i]==0)tem++,c/=p[i];if(tem){ // cout<<p[i]<<" "<<tem<<" "<<c<<endl;ll m = (mod*(p[i]-1));ans = ans*(((fun(p[i],(tem)*b+1,m)-1+m))/(p[i]-1)),ans%=mod;}} // cout<<c<<endl;if(c>1){ll m = (mod*(c-1));//cout<<c<<endl;ans = ans*(((fun(c,b+1,m)-1+m))/(c-1)),ans%=mod;}return ans; } int main() {prime();cin>>a>>b;cout<<solve()<<endl; return 0; }

總結(jié)

以上是生活随笔為你收集整理的POJ-1845 数论的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。