1. 程式人生 > >NEFU1493 快速冪取餘+除法取餘(逆元)

NEFU1493 快速冪取餘+除法取餘(逆元)

題目:

Gugu 有兩個長度無限長的序列A,B
A0=a^0/0!,A1=a^1/1!,A2=a^2/2!,A3=a^3/3!….
B0=0, B1=b^1/1!,B2=0,B3=b^3/3!,B4=0, B5=b^5/5! …
Douge 看到這道這兩個序列很覺得很麻煩,所以他想到一個好點子,他想把這兩個序列結合一個序列C
Cn= n! * sigma Ai*B(n-i) (n-i)>=0 i>=0
當Douge 把C序列寫到紙上覺得好多呀!!!所以他只想知道Cn,但是Douge 要去打遊戲,所以想尋求你來幫助他
Input
T組資料 (T<=1e5)
給出 a,b,n 0<=a,b,n<=1e9


Output
Cn%1e9+7
**Sample Input
1
1 1 1
Sample Output
1
Hint
大約1e5組資料,推薦使用scanf
樣例解釋:
C1=1!((A0*B1)+(A1*B0))=1!((1/0! 1/1!) + (1/1! * 0)) = 1

這裡寫圖片描述

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
using namespace std;
long long mod=1e9+7;
long long qm(long long a,long long b,long long m
) { long long ans=1; while(b) { if(b%2==1) { ans=(ans*a)%m; } a=(a*a)%m; b=b>>1; } return ans; } int main() { int t; long long a,b,n,ans; scanf("%d",&t); while(t--) { scanf("%lld %lld %lld",&a,&b,&n); if
(n==0&&a!=0&&b!=0) printf("1\n"); else { long long m1,m2,tmp; m1=(a+b);m2=a-b; tmp=qm(2,mod-2,mod); ans=(((qm(m1,n,mod)-qm(m2,n,mod)+mod)%mod)*qm(2,mod-2,mod))%mod;//**這個+mod尤其要注意,錯了好多遍** /*當時分奇偶寫了兩種公式,答案也是對的,但也有一個特別坑的地方 if(n%2==0) { long long m1,m2,tmp; m1=b+a;m2=b-a; tmp=(qm(m1,n,mod)-qm(m2,n,mod)+mod)%mod;//加mod ans=(tmp*qm(2,mod-2,mod))%mod; printf("%lld\n",ans); } else { long long m1,m2,tmp; m1=b+a;m2=b-a; tmp=(qm(m1,n,mod)+qm(m2,n,mod)+mod)%mod;//加mod,因為(b-a)有可能是負數 ans=(tmp*qm(2,mod-2,mod))%mod; printf("%lld\n",ans); } */ printf("%lld\n",ans); } } return 0; }

**