文章

7

粉丝

387

获赞

7

访问

64.9k

头像
数论小知识
P1166 清华大学上机题
发布于2021年1月10日 22:52
阅读数 8.6k

本题需要知道一个基础知识,以简化计算

很明显会有 k^n mod (k-1) = 1

所以很显然,k进制数所有数位加和与其本身,在模k-1的时候是同余的

而本题是取其k进制所有位数的和,一直进行加和直至小于k为止,那么就直接用x^y mod k-1即可,但是需要注意,题目实际是模k,那么如果最后模数是0,答案则是k-1

#include<stdio.h>
typedef long long ll;
ll AmulBmodP(ll a, ll b, ll p) {
    ll ret = 0;

    while (b) {
        if (b & 1)
            ret = (ret + a) % p;

        a = (a << 1) % p;
        b >>= 1;
    }

    return ret;
}
ll ApowBmodP(ll a, ll b, ll p) {
    ll ret = 1;

    while (b) {
        if (b & 1)
            ret = AmulBmodP(ret, a, p);

        a = AmulBmodP(a, a, p);
        b >>= 1;
    }

    return ret % p;
}
ll x, y, k;
ll ans;
int main() {
    while(scanf("%lld%lld%lld", &x, &y, &k) != EOF) {
        ans = ApowBmodP(x, y, k - 1);
        if(ans == 0) ans += k - 1;
        printf("%lld\n", ans);
    }
}

 

登录查看完整内容


登录后发布评论

暂无评论,来抢沙发