UVA12716-连续区间内反向寻因子法
在涉及的题目中如果需要使用连续区间内的数据的因数,可以放弃使用%这种低效的方案,从因数的角度进行,UVA12716中对于代码的优化就利用了这个小技巧。
原题:https://vjudge.net/problem/UVA-12716
代码如下:
1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 #include<cstring> 5 using namespace std; 6 const int maxn = 30000000; 7 int ans[maxn+10]; 8 9 int pre() 10 { 11 int b; 12 memset(ans,0,sizeof(ans)); 13 ans[1]=0; 14 for(int c=1;c<=maxn/2;++c) 15 { 16 for(int a=2*c;a<=maxn;a+=c) 17 { 18 if(c==(a xor (a-c)))++ans[a]; 19 } 20 } 21 for(int i=2;i<=maxn;i++) 22 ans[i]+=ans[i-1]; 23 return 0; 24 } 25 26 27 int main() 28 { 29 //freopen("input.txt","r",stdin); 30 //freopen("ans.txt","w",stdout); 31 pre(); 32 //printf("ok\n"); 33 int n; 34 scanf("%d",&n); 35 for(int i=1;i<=n;i++) 36 { 37 int p; 38 scanf("%d",&p); 39 printf("Case %d: %d\n",i,ans[p]); 40 } 41 return 0; 42 }
关于具体的题目解析,紫书中讲解已经十分明确,在此不补充。