解题思路以及方法,采用树状数组+上乘法逆元(费马定理)
费马定理的性质,使用快速幂求逆元的时候b一定要是素数
快速幂求逆元的核心 相当于把除变做乘
解题代码
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 1e6+10,mod = 1e9+7;
LL ar[N],n,m;
int lowbit(int x)
{
return x&-x;
}
LL pw(LL a,LL b)
{
LL ret=1;
while(b)
{
if(b&1)
ret=ret*a%mod;
a=a*a%mod;
b>>=1;
}
return ret;
}
void update(LL x,LL y)
{
for(int i=x;i<=n; i+=lowbit(i))
{
ar[i]*=y; ar[i]%=mod;
}
}
LL query(LL x)
{
LL ans = 1;
for(int i=x;i;i-=lowbit(i))
{
ans*=ar[i],ans%=mod;
}
return ans;
}
int main()
{
ios::sync_with_stdio(false); cin.tie(0);
cin>>n>>m;
LL x,y,z;
for(int i=1; i<=n; i++) ar[i] = 1;
for(int i=1; i<=m; i++)
{
cin>>x>>y>>z;
if(x==1)
{
update(y,z);
}
else if(x==2)
{
update(y,pw(z,mod-2));
}
else
{
cout<<query(z)*pw(query(y-1),mod-2)%mod<<"\n";
}
}
return 0;
}