对于一个迭代问题,首先可以考虑的是是不是可以打表。打表的实质就是针对输入数据的组合数很小的情况(或者是中间某个数值)下,解决多个询问的方法。主要是空间换时间的思想。
一般这个问题一个是可以在常数项内解决问题,然后询问远远大于(不太可能,但是也是有概率的) 。
但是常常的是一个迭代式,同时也可以暴力求解,这样的话,暴力中的n*T肯定超时,但是迭代的话可以在0(N)中求出所有的可能输入的结果,这样的话就是在0(n)预处理然后再很短的复杂度完成输入数据的查询。。。
但是一定要防止忘了等值迭代,其实只要在迭代的时候把各种情况考虑到,对于没有更新的值,问问自己是不是等于自己的初始值还是等于上一个的不变的值。
比如
f(x) = f(x-1) + x % 7 == 0 ? x * x : 0
我就忘了,当x % 7 != 0 的时候,更新f(x) = f(x-1) ; 这个一定要注意。
51Nod1082
LL table[2000000] ;
int Judge(int i) {
while(i){
if(i % 10 == 7) return 0 ;
i = i / 10 ;
}
return 1 ;
}
int main(){
for(int i = 1 ; i <= 2000000 ; i ++){
if(i % 7 != 0 && Judge(i)) {
table[i] = table[i-1] + (LL)i*i ;
}
else {
table[i] = table[i-1] ; ///别忘了。
}
}
int T ; cin >> T ;
while(T --) {
int n ; cin >> n ;
cout << table[n] << endl ;
}
}