NEFU1493 快速冪取餘+除法取餘(逆元)
阿新 • • 發佈:2019-02-07
題目:
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;
}
**