E题求等比数列的前n项和,为什么用逆元过不了啊

求大佬康康
不能过:
ll sum(ll a, ll b) {
ll fenzi = poww(a, b + 1) - 1;
ll niyuan = poww(a - 1, mod - 2);
return fenzi * niyuan % mod;
}
能过:
int sum(int p, int n)
{
if (n == 0)    return 1;
if (n & 1)    return sum(p, (n - 1) / 2) * (1 + poww(p, (n + 1) / 2)) % mod;
else    return (sum(p, n / 2 - 1) * (1 + poww(p, n / 2)) + poww(p, n)) % mod;
}
总的代码:
#include<iostream>
#include <stack>
using namespace std;
stack <int>s;
#define ll long long
const int mod = 9901;
ll poww(ll a, ll b) {
    ll ans = 1;
    while (b) {
        if (b & 1) {
            ans = (ans * a) % mod;
        }
        b >>= 1;
        a = (a * a) % mod;
    }
    return ans % mod;
}
/*ll sum(ll a, ll b) {
    ll fenzi = poww(a, b + 1) - 1;
    ll niyuan = poww(a - 1, mod - 2);
    return fenzi * niyuan % mod;
}*/
int sum(int p, int n)
{
    if (n == 0)    return 1;
    if (n & 1)    return sum(p, (n - 1) / 2) * (1 + poww(p, (n + 1) / 2)) % mod;
    else    return (sum(p, n / 2 - 1) * (1 + poww(p, n / 2)) + poww(p, n)) % mod;
}
int main() {
    ll a, b;
    cin >> a >> b;
    if (a == 0) {
        cout << 0 << endl; return 0;
    }
    ll ans = 1;
    for (int i = 2; i <= a; i++) {
        if (a % i == 0) {
            int s = 0;
            while (a % i == 0) {
                a /= i;
                s++;
            }
            ans = ans * sum(i, b * s) % mod;
        }
    }
    if(a>1) ans = ans * sum(a, b) %mod;
    cout << ans  << endl;
}




全部评论
因为a/b mod c转变为a * inv(b) mod c的前提是b和c互质。由题目可知c一定是个质数,所以如果b是c的倍数的时候就不能用逆元了,需要特判。(用其他的东西)
点赞 回复 分享
发布于 2022-02-20 18:04

相关推荐

2024-11-28 15:01
已编辑
三亚学院 前端工程师
在拧螺丝的西红柿很热情:学校放最前,一旦让看的人找了,找到了还不是比较好的学校,你就寄了,坦诚点放前面
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务