1. 程式人生 > >輕院 2180GJJ的日常之沈迷數學 逆元求除法取余

輕院 2180GJJ的日常之沈迷數學 逆元求除法取余

str fault 題目 == 求助 利用 整數 targe print

題目鏈接:https://acm.zzuli.edu.cn/zzuliacm/problem.php?id=2180

題目大意:求數列 k0,k1,k2...kn的和,即等比數列的前n項和對1e9+7取余的結果。

解題思路:等比數列前N項和為 技術分享,因此只要能夠取余即可求得結果。利用擴展GCD求q-1關於mod的逆元然後快速冪取模計算即可。

代碼:

 1 const int inf = 0x3f3f3f3f;
 2 const int maxn = 1e6 + 5;
 3 int k, n;
 4  
 5 void ext_gcd(ll a, ll b, ll &d, ll &x, ll &y){
6 if(b == 0){ 7 d = a; x = 1; y = 0; 8 } 9 else{ 10 ext_gcd(b, a % b, d, y, x); y -= x * (a / b); 11 } 12 } 13 ll pow_mod(ll a, ll b, ll m){ 14 if(b == 0) return 1; 15 ll tmp = pow_mod(a, b / 2, m); 16 ll ans = tmp * tmp % mod; 17 if(b & 1) ans = a % mod * ans % mod;
18 return ans % mod; 19 } 20 void solve(){ 21 if(k == 1){ 22 printf("%d\n", (n + 1) % mod); 23 return; 24 } 25 ll a = k - 1; 26 ll b = mod, d, x, y; 27 ext_gcd(a, b, d, x, y); 28 if(x < 0) x = x + (abs(x) / mod + 1) * mod; 29 x %= mod; 30 ll tmp = pow_mod(k, n + 1
, mod); 31 ll ans = (tmp * x - x) % mod ; 32 ans %= mod; 33 printf("%lld\n", ans); 34 } 35 int main(){ 36 int t = 1; 37 while(scanf("%d %d", &k, &n) != EOF){ 38 printf("Case %d: ", t++); 39 solve(); 40 } 41 }

題目:

GJJ的日常之沈迷數學

Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 281 Solved: 21

SubmitStatusWeb Board

Description

GJJ每天都要膜拜一發數學大佬,因為GJJ的數學太差了。這不,GJJ又遇到難題了,他想求助WJJ,但是WJJ這幾天忙於追妹子,哪有時間給他講題, 於是GJJ求助於熱愛ACM的你,Acmer們能幫幫他嗎?問題是求: k^0 + k^1 +...+ k^(n) mod p (0 < k < 100, 0 <= n <= 10^9, p = 1000000007) 例如:6^0 + 6^1 +...+ 6^(10) mod 1000000007 (其中k = 6, n = 10, p = 1000000007)

Input

輸入測試數據有多組,每組輸入兩個整數k, n

Output

每組測試數據輸出:Case #: 計算結果

Sample Input

2 1 6 10

Sample Output

Case 1: 3 Case 2: 72559411

輕院 2180GJJ的日常之沈迷數學 逆元求除法取余