求助RE 63pts
查看原帖
求助RE 63pts
305522
WangBX楼主2024/10/5 17:28

RT,#27(subtask #1)#30(subtask #5)两个点RE了 记录

#include<algorithm>
#include<iostream>
#include<cstring>
#include<vector>
#include<stack>
#include<cmath>
using namespace std;
const int MOD=1000'000'007;
int n,d[1000005],x[1000005];
long long ans,dp[1000005];
long long add[7005][7005];//add[x][y]: i%x==y  then +=add[x][y]
vector<pair<int,long long>> pr[1000005];//first=d  second=delta
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin>>n;
	int k=sqrt(n)+2;
	dp[1]=1;
	for(int i=1;i<=n;i++)
	{
		cin>>d[i]>>x[i];
		for(auto it:pr[i])
		{
			int d=it.first,delta=it.second;
//			for(int j=i;j<=n;j+=d)	cout<<j<<",";
//			cout<<"\b+="<<delta<<endl;
			if(d<=k)	(add[d][i%d]+=delta)%=MOD;
			else
			{
				for(int j=i;j<=n;j+=d)
					(dp[j]+=delta)%=MOD;
			}
		}
		for(int j=1;j<=k;j++)
			(dp[i]+=add[j][i%j])%=MOD;
		if(d[i]!=0)
		{
			pr[i+d[i]].emplace_back(d[i],dp[i]);
			if(1ll*x[i]*d[i]+d[i]+i<=n)pr[x[i]*d[i]+d[i]+i].emplace_back(d[i],-dp[i]);
//			cout<<"set ";
//			for(int j=i+d[i];j<=n;j+=d[i])	cout<<j<<",";
//			cout<<"\b+="<<dp[i]<<endl;
//			cout<<"set ";
//			for(int j=min(1ll*x[i]*d[i]+d[i]+i,1ll*n+1);j<=n;j+=d[i])	cout<<j<<",";
//			cout<<"\b-="<<dp[i]<<endl;
		}
		(ans+=dp[i])%=MOD;
	}
//	for(int i=1;i<=n;i++)	cout<<dp[i]<<" \n"[i==n];
	cout<<(ans%MOD+MOD)%MOD<<endl;
}
2024/10/5 17:28
加载中...