이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include<bits/stdc++.h>
using namespace std;
using i64 = long long;
#define debug false
#define int long long
const int maxn = 1e5;
const int blocksize = trunc(sqrt(maxn));
const i64 MOD = 1e9 + 7;
int add(int a , int b){
return ((i64)a + (i64)b + MOD*MOD) % MOD;
}
int n;
int d[maxn+2] , x[maxn+2];
int dp[maxn+2] , acc[blocksize+2][blocksize+2] , store[maxn+2][blocksize+2];
void add_to_add(int x , int jump , int val){
if (x > n) return;
store[x][jump] = add(store[x][jump] , val);
}
int32_t main(){
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cin >> n;
for (int i = 1; i <= n; ++i) cin >> d[i] >> x[i];
dp[1] = 1;
for (int i = 1; i <= n; ++i){
for (int jump = 1; jump <= blocksize; jump++){
int r = i % jump;
acc[r][jump] = add(acc[r][jump] , store[i][jump]);
dp[i] = add(dp[i] , acc[r][jump]);
}
if (d[i]==0) continue;
if (d[i] <= blocksize){
i64 jump = d[i];
add_to_add(i + jump , jump , dp[i]);
add_to_add(i + x[i] * jump + jump , jump , -dp[i]);
}
else {
for (int j = 1; j <= x[i] && i + j * d[i] <= n; ++j){
int nxt = i + j * d[i];
dp[nxt] = add(dp[nxt] , dp[i]);
}
}
}
if (debug){
cout << "DEBUG\n";
for (int i = 1; i <= n; ++i) cout << dp[i] << ' ';
cout << '\n';
}
int ans = 0;
for (int i = 1; i <= n; ++i) ans = add(ans , dp[i]);
cout << ans;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |