题目链接
用树状数组维护前n个的乘积模上mod
- 做添加操作时:
让树状数组tr[]乘上要增加的倍数,还必须做取模操作,所以结果存的是前n项的乘积取模之后的结果。
- 做删除操作时
因为之前存的是模之后的结果,删除是除法运算,不能直接进行除法运算,所以要求逆元。
因为模数是素数,所以
必须是mod为素数才可以用这个公式
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod = 1e9+7;
const int N = 1e6+5;
ll tr[N];
int n,m;
ll qpow(ll a,ll b)
{
ll res = 1;
while(b)
{
if(b&1)res = res*a%mod;
b >>= 1;
a = a*a%mod;
}
return res;
}
void add(ll x,ll y)
{
while(x<=n)
{
tr[x]=tr[x]*y%mod;
x += x&-x;
}
}
ll sum(ll x)
{
ll res = 1;
for(int i=x;i>0;i-=i&-i)
res = res*tr[i]%mod;
return res;
}
int main()
{
scanf("%d%d",&n,&m);
int x,y,z;
for(int i=1;i<=n;i++) tr[i]=1;
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&z);
if(x==1)
add(y,z);
else if(x==2)
add(y,qpow(z,mod-2)%mod);
else
printf("%lld\n",sum(z)*qpow(sum(y-1),mod-2)%mod);
}
return 0;
}
标签:树状,int,res,ll,tr,牛客,逆元,mod 来源: https://blog.csdn.net/qq_50285142/article/details/118437971
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。