救救蒟蒻,68分,hank数据过掉了,普通点没过
查看原帖
救救蒟蒻,68分,hank数据过掉了,普通点没过
685127
MaLX楼主2022/4/18 22:46
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const long long pi=1e7+19;
const long long ni=2e5;
#include<unordered_map>
unordered_map<long long,long long>mp;
void solve();
long long ai[ni],bi[ni],ksn[ni*51],t,n,m;
long long add,mul=1,sum,ans;
struct quert{long long op,a,b;}q[ni];
int main(){solve();return 0;}
void solve(){
	ksn[1]=1;
	for(int i=2;i<pi;i++)ksn[i]=(pi-pi/i)*ksn[pi%i]%pi;
	scanf("%lld%lld",&n,&m);
	for(long long i=1;i<=m;i++){
		long long a,b=0,c=0;scanf("%lld",&a);
		if(a!=6)scanf("%lld",&b);
		if(a==1)scanf("%lld",&c);
		b=(b%pi+pi)%pi;c=(c%pi+pi)%pi;
		q[i]={a,b,c};
	}
	scanf("%lld",&t);bi[0]=1;ai[0]=-1;
	for(long long i=1;i<=t;i++)
	scanf("%lld%lld",&ai[i],&bi[i]);
	for(long long ki=m+1;ki<=m*t+m;ki++){
		long long i=(ai[(ki-1)/m]+bi[(ki-1)/m]*(ki%m)%m+m)%m+1;
		long long a=q[i].a,b=q[i].b;
		// printf("[%lld %lld __%lld__ %lld %lld %lld]\n",ki,i,q[i].op,a,b,mp[1]);
		switch(q[i].op){
			case 1:(sum+=b-mp[a]*mul%pi-add+pi)%=pi;b+=pi-add;(b*=ksn[mul])%=pi;mp[a]=b;break;
			case 2:(add+=a)%=pi;(sum+=n*a%pi)%=pi;break;
			case 3:if(a==0)goto W;(mul*=a)%=pi;(add*=a)%=pi;(sum*=a)%=pi;break;
			case 4:W:mul=1;sum=a*n%pi;add=a%pi;mp.clear();break;
			case 5:(ans+=mp[a]*mul%pi+add)%=pi;break;
			case 6:(ans+=sum)%=pi;break;
		}
		// printf("(%lld %lld %lld %lld)\n",add,mul,sum,ans);
	}
	printf("%lld",(ans+pi)%pi);cerr<<ans%pi<<endl;
}
2022/4/18 22:46
加载中...