hdu 6050 Funny Function
根据题目所给的递推公式我们可以打表出n=10以内的数据,寻找规律,当然对于这种给了你递推公式,我们可以利用Excel表格来找规律,这个题最后的规律:
因为题上给的数据比较大,所以这里我们算整数幂的时候要用整数快速幂,还有个知识点就是这里牵涉到一个对一个除数取余的事情,这里要用到逆元+费马小定理
费马小定理: 假如p是质数,且gcd(a,p)=1,那么 a^(p-1)≡1(mod p),即:假如a是整数,p是质数,且a,p互质(即两者只有一个公约数1),那么a的(p-1)次方除以p的余数恒等于1。
逆元:a*(a^-1)= 1= 1%p;
费马小定理:a^(p-1)=1% p;
两式结合:(a^-1) = a^(p-2);
code
#include <bits/stdc++.h>
//#define mod 1e9+7
typedef long long LL;
const LL mod = 1e9+7;
using namespace std;
LL n,m,ans,res;
LL Mult(LL x,LL N)
{
ans = 1;
res = x;
while(N){
if(N&1)
ans = res*ans%mod;
res = res*res%mod;
N>>=1;
}
return ans;
}
LL inv(LL x){
return Mult(x,mod-2);
}
int main()
{
int T;scanf("%d",&T);
while(T--)
{
LL anss;
scanf("%lld %lld",&n,&m);
if(n%2==0){
anss = (Mult((Mult(2,n)-1),m-1)%mod*2)*inv(3)%mod;
}
else{
anss = (Mult((Mult(2,n)-1),m-1)*2%mod+1)*inv(3)%mod;
}
printf("%lld\n",anss);
}
return 0;
}