过样例全 WA,和第一篇题解思路一致
查看原帖
过样例全 WA,和第一篇题解思路一致
507348
__vector__楼主2023/3/14 23:37

三个关注。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll p=1e7+19;
const int maxq=1e5+5;
int n,q,t;
ll ksm(ll a,ll b)
{
    ll ret=1;
    while(b)
    {
        if(b&1)ret=ret*a%p;
        a=a*a%p;
        b>>=1;
    }
    return ret;
}
ll inv(ll a)
{
    return ksm(a,p-2);
}
unordered_map<ll,ll> nodelazyadd;
struct DT
{
    int op,i;
    ll val;
}dt[maxq];
int main()
{
    scanf("%d%d",&n,&q);
    for(int i=1;i<=q;i++)
    {
        scanf("%d",&dt[i].op);
        if(dt[i].op==1)
        {
            scanf("%d%lld",&dt[i].i,&dt[i].val);
            dt[i].val%=p;
        }
        if(dt[i].op==2||dt[i].op==3||dt[i].op==4)
        {
            scanf("%lld",&dt[i].val);
            dt[i].val%=p;
        }
        if(dt[i].op==5)
        {
            scanf("%d",&dt[i].i);
        }
    }
    scanf("%d",&t);
    ll lazymul=1,lazyadd=0;
    ll sum=0;
    ll ans=0;
    for(int i=1;i<=t;i++)
    {
        ll ai,bi;
        scanf("%lld%lld",&ai,&bi);
        for(int j=1;j<=q;j++)
        {
            int opidx=(ai+1ll*j*bi)%q+1;
            if(dt[opidx].op==1)
            {
                sum-=(nodelazyadd[dt[opidx].i]*lazymul+lazyadd);
                nodelazyadd[dt[opidx].i]=(dt[opidx].val-lazyadd)*inv(lazymul);
                nodelazyadd[dt[opidx].i]%=p;
                sum+=(nodelazyadd[dt[opidx].i]*lazymul+lazyadd);
                sum%=p;
            }
            if(dt[opidx].op==2)
            {
                lazyadd+=dt[opidx].val;
                lazyadd%=p;
                sum+=1ll*n*dt[opidx].val;
                sum%=p;
            }
            if(dt[opidx].op==3)
            {
                lazyadd*=dt[opidx].val;
                lazyadd%=p;
                lazymul*=dt[opidx].val;
                lazymul%=p;
                sum*=dt[opidx].val;
                sum%=p;
            }
            if(dt[opidx].op==4)
            {
                nodelazyadd.clear();
                lazymul=1;
                lazyadd=dt[opidx].val;
                lazyadd%=p;
                sum=ll(n)*dt[opidx].val;
                sum%=p;
            }
            if(dt[opidx].op==5)
            {
                ans+=(nodelazyadd[dt[opidx].i]*lazymul+lazyadd);
                ans%=p;
            }
            if(dt[opidx].op==6)
            {
                ans+=sum;
                ans%=p;
            }
        }
    }
    printf("%lld",(ans%p+p)%p);
    return 0;
}  
2023/3/14 23:37
加载中...