错了很久是因为要去求逆元
同余模定理不适合除法
举个例子
30/2Mod4=(15)Mod4=3;
要分开模就是1
必须要用费马小定理来求
在模为素数p的情况下,有费马小定理
a^(p-1)=1(mod p)
那么a^(p-2)=a^-1(mod p)
也就是说a的逆元为a^(p-2)
剩下的就是快速幂取模
long long pow4(int a,int b)
{
long long base=a,r=1;
while(b){
if(b&1) r=(r*base)%M;
base=base*base%M;
b>>=1;
}
return r%M;
}
代码如下
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int M=1e9+7;
long long pow4(int a,int b)
{
long long base=a,r=1;
while(b){
if(b&1) r=(r*base)%M;
base=base*base%M;
b>>=1;
}
return r%M;
}
int inv(int a,int b) //Modular inverse
{
return pow4(a,b-2);
}
int main()
{
int t,cnt=0;
scanf("%d",&t);
while(t--){
long long sum=1;
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
if(a==1){
sum=(sum*(c-b+1))%M;
}
else {
sum=(sum*pow4(a,b))%M;
sum=(sum*(pow4(a,c-b+1)-1))%M;
sum=(sum*inverse(a-1,M))%M;
}
}
printf("Case #%d: %lld\n",++cnt,sum);
}
}