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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

POJ-1845 Sumdiv 逆元,特殊情况

發(fā)布時間:2024/8/23 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 POJ-1845 Sumdiv 逆元,特殊情况 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

詳見代碼:

#include <cstdlib> #include <cstring> #include <cstdio> #include <cmath> #define MOD 9901 // 9901是一個素數(shù) using namespace std;int A, B; // 計算A^B的所有因子的和 int num[50], ex[50], idx; // 記錄所有的因子和指數(shù)void deal(int x) {idx = -1;for (int i = 2; i <= (int)sqrt(double (x)); ++i) {if (x % i == 0) {++idx;num[idx] = i;ex[idx] = 0;while (x % i == 0) {++ex[idx];x /= i;}}}if (x != 1) {++idx;num[idx] = x;ex[idx] = 1;} // 分解完成 }
/* A * x = 1 mod B; A * x - B * y = 1; 要求1必須是gcd(A, B)的倍數(shù),由于9901是一個素數(shù),因此只有當(dāng)A==9901是不符合要求的 */int exgcd(int a, int b,int &x, int &y) { if (b == 0) {x = 1, y = 0;return a;}int ret = exgcd(b, a % b, x, y);int t = x;x = y;y = t - a/b*y;return ret; }int getinv(int v) {v %= MOD;int a = v, b = MOD, x, y;exgcd(a, b, x, y);x = (x % MOD + MOD) % MOD;return x; }int _pow(int a, int b) {int ret = 1;a %= MOD;while (b) {if (b & 1) {ret *= a;ret %= MOD;}b >>= 1;a *= a;a %= MOD;}return ret; } // 1073741824 // 等比公式是 (num[i]^exp[i])^B = num[i]^exp[i]*B // 其因子和為num[i]^0 + num[i]^1 + ...num[i]^exp[i]*B // 化簡之后就是 (num[i]^(exp[i]*B+1)-1)/(num[i]-1)int main() {int ret;while (scanf("%d %d", &A, &B) == 2) {ret = 1;deal(A); // 對A進行分解for (int i = 0; i <= idx; ++i) {if (num[i] % MOD == 1) { // 這里要進行一下特殊處理,不然就直接去就0的逆元了 ret *= (ex[i]*B+1)%MOD;ret %= MOD;} else {ret *= ((_pow(num[i]%MOD, ex[i]*B+1)-1+MOD)%MOD*getinv(num[i]-1))%MOD;ret %= MOD;}}printf("%d\n", ret);}return 0; }

?

轉(zhuǎn)載于:https://www.cnblogs.com/Lyush/archive/2013/01/04/2844741.html

總結(jié)

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

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