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 }

关于具体的题目解析,紫书中讲解已经十分明确,在此不补充。

posted @ 2020-02-01 16:15  SavenNeer  阅读(155)  评论(0编辑  收藏  举报