本文主要是介绍【数论】hdu_1999_不可摸数_201407310919,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
不可摸数
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 8360 Accepted Submission(s): 2151
Problem Description
s(n)是正整数n的真因子之和,即小于n且整除n的因子和.例如s(12)=1+2+3+4+6=16.如果任何
数m,s(m)都不等于n,则称n为不可摸数.
数m,s(m)都不等于n,则称n为不可摸数.
Input
包含多组数据,首先输入T,表示有T组数据.每组数据1行给出n(2<=n<=1000)是整数。
Output
如果n是不可摸数,输出yes,否则输出no
Sample Input
3 2 5 8
Sample Output
yes yes no
Author
Zhousc@ECJTU
思路:
采用 筛法求素数的理论来求100w以内的数的因子和,测试可以知道当超过100w时,因子和<=1000的不可摸数的数量不变。(详见代码)
代码如下:
</pre><pre name="code" class="html"><pre name="code" class="html">#include <stdio.h>
#include <string.h>
#include <time.h>
#define maxn 1000005int s[maxn],sum[maxn];void InitTable()
{int i,j,k,num=0;memset(sum,0,sizeof(sum));memset(s,0,sizeof(s));for(i=1;i<maxn/2;i++)//类似于筛法求素数,以 i 为因子, {for(j=i*2;j<maxn;j+=i)sum[j]+=i;}for(i=2;i<maxn;i++)if(sum[i]<=1000){s[sum[i]]++;}//for(i=1;i<=1000;i++)//当maxn大于100w时,num的值不变 //if(s[i]>0)//{//num++;//}//printf("num=%d\n",num);
}
int main()
{int T;// 1 -> 6 为测试程序运行时间的; //clock_t start,finish;// 1 //double total_time;// 2//start = clock();// 3InitTable();//finish = clock();// 4//total_time = (double)(finish-start)/CLOCKS_PER_SEC;// 5//printf("%lf seconds\n",total_time);// 6scanf("%d",&T);while(T--){int i,j,k,n;scanf("%d",&n);if(s[n]==0)printf("yes\n");elseprintf("no\n");}return 0;
}
体会 :以前遇到过用筛法求因子的题,一直没好好看怎么弄的,之前的那个题用暴力勉强可以过,然后就没有具体看筛法的,现在彻底弄明白了,用时间函数测试的求100w的因子和的时间是328MS,比较快
这篇关于【数论】hdu_1999_不可摸数_201407310919的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!