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;
}