快速幂 费马小定理 ——HDU 4704

4704在这里插入图片描述

10^100000 不是100000 看好数据范围
使用字符串存输入

题意:
不定量个正整数相加得n

1:1
2:2
3:4
4:8
归纳可得:2^n-1
也可:
C(n,0)+C(n,1)+C(n,2)+.+C(n,n)=2^n

费马小定理(降幂)

如果p是一个质数,而整数a不是p的倍数,则有a^(p-1)≡1(mod p)

在这里插入图片描述


#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<string>
using namespace std;
typedef unsigned long long ll;
ll r = 1e9+7;
ll quick_mul(ll a,ll b,ll r){
    ll ans = 0;
    while(b){
        if(b&1)
            ans = (ans+a) % r;
        a = (a+a)%r;
        b >>= 1;
    }
    return ans;
}
ll quick_pow(ll a,ll b,ll r){
    ll ans = 1;
    while(b){
        if(b&1)
            ans = quick_mul(ans,a,r) % r;
        a = quick_mul(a,a,r) % r;
        b >>= 1;
    }
    return ans;
}
int main(){
    string s;
    while(cin >> s){
        ll n = 0;
        ll len = s.size();
        for(int i=0; i<len; i++){
            n = (n*10 + s[i]-'0') % (r-1);
        }
        n = (n-1+(r-1))%(r-1);
        cout << quick_pow(2,n,r) << endl;
    }
    return 0;
}

发布了30 篇原创文章 · 获赞 0 · 访问量 668

猜你喜欢

转载自blog.csdn.net/jhckii/article/details/104166915
今日推荐