POJ1845Sumdiv(逆元or等比數列求和)

2021-07-31 11:11:53 字數 2146 閱讀 1939

附上acdreamer的講解:

題目:

題意:給定兩個正整數9901取餘後的值。

分析:很容易知道,先把

的所有因子和的表示式如下

所以我們有兩種做法。第一種做法是二分求等比數列之和。

**:

如果採用等比數列首項為一次項的計算方法,則需要另外加上1

#include#include#includeusing namespace std;

typedef long long ll;

const int n = 10005;

const int mod = 9901;

bool prime[n];

int p[n], cnt;

void isprime()

}ll power(ll a, ll b)

return ans;

}ll sum(ll a, ll n)

ll t = sum(a, n / 2);

if(n & 1)

else

return t;

}void solve(ll a, ll b)

ans *= (sum(p[i], num*b) + 1) % mod;

ans %= mod;}}

if(a > 1)

cout << ans << endl;

}int main()

solve(a, b);

}return 0;

}

如果採用等比數列首項為0次項的計算方法,則需要傳入的引數n(項數)為不包括0次項的項數

#include #include #include using namespace std;

typedef long long ll;

const int n = 10005;

const int mod = 9901;

bool prime[n];

int p[n];

int cnt;

void isprime()

return ans;

}ll sum(ll a,ll n)

else

return t;

}void solve(ll a,ll b)

ans *= sum(p[i],num*b) % mod;

ans %= mod;}}

if(a > 1)

cout<>a>>b)

solve(a,b);

return 0;

}

第二種方法就是用等比數列求和公式,但是要用逆元。用如下公式即可

因為int範圍,所以在快速冪時要二分乘法。

#include #include #include using namespace std;

typedef long long ll;

const int n = 10005;

const int mod = 9901;

bool prime[n];

int p[n];

int cnt;

void isprime()

return ans;

}ll quick_mod(ll a,ll b,ll m)

b >>= 1;

a = multi(a,a,m);

}return ans;

}void solve(ll a,ll b)

ll m = (p[i] - 1) * mod;

ans *= (quick_mod(p[i],num*b+1,m) + m - 1) / (p[i] - 1);

ans %= mod;}}

if(a > 1)

cout<>a>>b)

solve(a,b);

return 0;

}

POJ1845 Sumdiv 數學?逆元?

當初寫過一篇分治的 題意 求a b的所有因子之和,並對其取模 9901再輸出 對於數a p1 c1 p2 c2 pn cn,它的所有約數之和為 1 p1 p1 2 p1 3 p1 c1 b 1 p2 p2 2 p2 3 p2 c2 b 1 pn pn 2 pn 3 pn cn b 注意到約數之和的每...

Poj1845 Sumdiv 解題報告

真沒想到!其實我們可以先將 a b 分解成質因數的 因為 a b 的因數肯定是 a b 的質因數在一定的條件下相乘而成的 然後組合一下 h ovny 走開!別誤導別人!來一波公式 所有因數的和 pi 讀作pi,是 pi 的大寫,表示累乘 sigma 讀作sigma,是 sigma 的大寫,表示累加 ...

poj 1845 Sumdiv ,質因子分解

題意 求a b的所有約數之和。題解 a p1 a1 p2 a2 pn an.a b的所有約數之和為 sum 1 p1 p1 2 p1 a1 b 1 p2 p2 2 p2 a2 b 1 pn pn 2 pn an b 用遞迴二分求等比數列1 pi pi 2 pi 3 pi n 1 若n為奇數,一共有偶...