ZOJ 2095和HDU1215(打表)(优化)

来源:互联网 发布:学linux 编辑:程序博客网 时间:2024/04/28 11:19

题目大意:给出一个n,然后输入n个数,求每个数x的因子之和,x的本身除外。

分析:这类连续使用因数和的题目应该想到打表,简单实用。但是由于x的上限是500000,所以如果不进行优化的话,肯定会超时,优化打表,刚开始接触这个,很实用。

思路有两种,第一种思路是用i*j的乘积进行打表。代码几乎一样只是第二种要控制一下输出。

#include<iostream>#include<cstdio>using namespace std;const int N=500005;int main(){    int a[N]={0,0};    for(int i=1;i<=N/2;i++)        for(int j=2;j*i<N;j++)                a[i*j]+=i;        int t,n;        cin>>t;        while(t--)        {            scanf("%d",&n);            printf("%d\n",a[n]);        }        return 0;}

因为i是从2开始,少加了i=1的这种情况,所以输出在加上1;

#include<iostream>#include<cmath>using namespace std;int a[500005]={0,-1};int main(){    int n,x;    for(int i=2;i<=250000;i++)    {            for(int j=2;j*i<=500000;j++)                a[i*j]+=i;    }    cin>>n;    while(n--)    {        cin>>x;        cout<<a[x]+1<<endl;    }    return 0;}

第二种思路是用j代表i的2倍进行打表

#include<iostream>#include<cstdio>using namespace std;const int N=500005;int main(){    int a[N]={0,0};    for(int i=1;i<=N/2;i++)        for(int j=2*i;j<N;j+=i)                a[j]+=i;        int t,n;        cin>>t;        while(t--)        {            scanf("%d",&n);            printf("%d\n",a[n]);        }        return 0;}


0 0