原题链接:http://codeforces.com/problemset/problem/797/E
题解:
分块就好了,预处理出小于k<sqrt(n)的所有的结果,对于k>=sqrt(n)的直接暴力运算就好了。
时间复杂度O(nsqrt(n))
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e5+5;
const int BLK=355;
int dp[BLK][MAXN],a[MAXN];
int n;
int dfs(int now,int p)
{
if(p>n)
return 0;
if(now<BLK)
{
if(dp[now][p])
return dp[now][p];
else
return dp[now][p]=dfs(now,p+a[p]+now)+1;
}
else
return dfs(now,p+a[p]+now)+1;
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
for(int i=1;i<BLK;i++)
{
dfs(i,1);
}
int q;
scanf("%d",&q);
while(q--)
{
int p,k;
scanf("%d%d",&p,&k);
printf("%d\n",dfs(k,p));
}
return 0;
}