不可摸数

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 5334    Accepted Submission(s): 1405

Problem Description
s(n)是正整数n的真因子之和,即小于n且整除n的因子和.例如s(12)=1+2+3+4+6=16.如果任何
数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
  1 /*
  2 //代码一:-----超时
  3 #include<stdio.h>
  4 #include<math.h>
  5
  6 int fun(int num)
  7 {
  8     int i,k=0;
  9     for(i=1;i<=(int)sqrt(num);++i)
 10         if(num%i==0)
 11         {
 12             if(num/i!=i)
 13             {
 14                 k+=i;
 15                 k+=num/i;
 16             }
 17             else
 18                 k+=i;
 19         }
 20     return k;
 21 }
 22
 23 int main()
 24 {
 25     int T,i,n,flag;
 26     scanf("%d",&T);
 27     while(T--)
 28     {
 29         flag=0;
 30         scanf("%d",&n);
 31         for(i=1;i<=(n-1)*(n-1);++i)
 32         {
 33             if(fun(i)==n)
 34             {
 35                 flag=1;
 36                 break;
 37             }
 38         }
 39         if(flag)
 40             printf("no\n");
 41         else
 42             printf("yes\n");
 43     }
 44     return 0;
 45 }
 46
 47
 48
 49 */
 50
 51
 52 /*
 53 代码二:---AC
 54 标准的筛选法---求出每个数的因子和,
 55 然后看因子和是否在1000以内,是的话就证明等于因子和的这个数是不可摸数。
 56 */
 57 #include<stdio.h>
 58 #define MAX 500001   //这题数据求到这里就可以了
 59
 60 int sum[MAX];
 61 int flag[1001];
 62
 63 void init()   //筛选法算出1000内存在的的因子和
 64 {
 65     int i,j;
 66     for(i=1;i<=MAX/2;++i)  //不知道为啥 这里开到刚超出1000了就不对
 67         for(j=i+i;j<MAX;j+=i)
 68             sum[j]+=i;
 69     for(i=1;i<MAX;++i)
 70         if(sum[i]<=1000)
 71             flag[sum[i]]=1;
 72 }
 73
 74
 75 int main()
 76 {
 77     int T,n;
 78     init();
 79 //    printf("%d\n",sum[500000]);
 80     scanf("%d",&T);
 81     while(T--)
 82     {
 83         scanf("%d",&n);
 84         if(flag[n])
 85             printf("no\n");
 86         else
 87             printf("yes\n");
 88     }
 89     return 0;
 90 }
 91
 92
 93
 94
 95 /*
 96
 97 对于这个题有两个引理和公认:
 98 1.     若x为大于2的偶数,那么s(x)>x/2;
 99 2.     若x是一个正奇数,而s(x)是偶数,那么x必然是一个平方数。
100 3.     只有一个不可摸数是奇数,那是5
101 有以上三个结论,便可以算出一定范围内的不可摸数。
102
103 代码三:
104 */
105 #include <iostream>
106 using namespace std;
107 int  arry[1005];
108
109 void check()
110 {
111     int sum;
112     for(int i=2;i<=2000;i+=2)
113     {
114         sum=0;
115         for(int j=1;j<=i/2;++j)
116         {
117             if(i%j==0)
118                 sum+=j;
119         }
120         if(sum<=1000)
121             arry[sum]=1;
122     }
123     for(int i=3;i<=1000;i+=2)
124     {
125         sum=0;
126         for(int j=1;j<=(i*i)/2;j+=2)
127         {
128             if((i*i)%j==0)
129                 sum+=j;
130         }
131         if(sum<=1000)
132             arry[sum]=1;
133     }
134
135 }
136 int main()
137 {
138     check();
139     int t;
140     scanf("%d",&t);
141     while(t--)
142     {
143         int n;
144         scanf("%d",&n);
145         if(n==5)
146             cout<<"yes"<<endl;
147         else
148         {
149             if(arry[n]||n%2==1)
150                 cout<<"no"<<endl;
151             else
152                 cout<<"yes"<<endl;
153         }
154     }
155     return 0;
156 }

转载于:https://www.cnblogs.com/dongsheng/archive/2012/08/18/2645594.html

HDOJ-1999 不可摸数相关推荐

  1. HDU 1999 不可摸数

    不可摸数 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  2. 不可摸数http://acm.hdu.edu.cn/showproblem.php?pid=1999

    不可摸数 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  3. hdu1999 不可摸数 好题.

    题意: s(n)是正整数n的真因子之和,即小于n且整除n的因子和.例如s(12)=1+2+3+4+6=16.如果任何数m,s(m)都不等于n,则称n为不可摸数.  (2<=n<=1000) ...

  4. HDOJ 1282 回文数猜想

    /*******************************************                                                       H ...

  5. HDOJ(HDU) 2502 月之数(进制)

    Problem Description 当寒月还在读大一的时候,他在一本武林秘籍中(据后来考证,估计是计算机基础,狂汗-ing),发现了神奇的二进制数. 如果一个正整数m表示成二进制,它的位数为n(不 ...

  6. HDOJ 1282 回文数猜想(回文串类)

    Problem Description 一个正整数,如果从左向右读(称之为正序数)和从右向左读(称之为倒序数)是一样的,这样的数就叫回文数.任取一个正整数,如果不是回文数,将该数与他的倒序数相加,若其 ...

  7. HDOJ 5184 Brackets 卡特兰数扩展

    既求从点(0,0)仅仅能向上或者向右而且不穿越y=x到达点(a,b)有多少总走法... 有公式: C(a+b,min(a,b))-C(a+b,min(a,b)-1)  /// 折纸法证明卡特兰数: h ...

  8. HDU1999不可摸数-暴力打表

    看到这约数和第一反应是约数和函数,然后仔细一看不是正经的约数和函数,就去推去了,然后推的有点小复杂.(数论函数那部分做多了) 然后观察也没有用到什么数论部分的特殊知识啊,难不成真的要暴力? 大概分析了 ...

  9. 51单片机实例学习二 按键中断识别、定时器、利用定时器产生乐曲、数摸转换 ADC0804和DAC0832

    六.按键中断识别 [实验任务] 采用中断技术,每按一下按键,计数器加1,并用LED显示出来. [硬件电路] 注意:我们只用4位数码管中的两位. 注意:a接P0.0;b接P0.1;c接P0.3-- 注意 ...

最新文章

  1. 重构-改善既有代码的设计:对象之间移动特性的八种方法(五)
  2. vs2010 失效后的解决办法
  3. 【2D动画】《想你》。。。。难以想象
  4. UE4如何贴混合贴图_UE4[蓝图]动态积雪材质的实现(一)
  5. C# 检查当前系统已安装的程序app/两种方法检测
  6. 【Level 08】U06 Good Feeling L1 End-of-season game
  7. System-Level Registers and Data Structures in IA-32e Mode and 4-Level Paging
  8. 普通程序员能实现财务自由吗?
  9. oracle的三个网络配置文件
  10. js中事件捕获和事件冒泡
  11. 面向对象及os模块、socket模块
  12. http keepalive原理
  13. CIH病毒的分析与清除
  14. 数字c语言代码大全,C语言代码大全
  15. Win系统 - WIN10 版本号说明
  16. mysql.sock 是什么_mysql.sock到底存了什么信息?
  17. 电动汽车结构原理基础知识
  18. Spring Cloud 入门 ---- Security 整合 Oauth2 认证授权【随笔】
  19. echarts环形图--彩虹图--蚊香图
  20. 20、个人信息 - 小程序端开发 - 微擎小程序模块应用开发

热门文章

  1. Hue中Sqoop导数报错Could not load db driver class: com.mysql.jdbc.Driver
  2. Android使用Http访问网络
  3. R︱高效数据操作——data.table包(实战心得、dplyr对比、key灵活用法、数据合并)
  4. 数学倒底有没有绝对的严格性和形式化?
  5. CentOS6.5 安装并配置vsftpd
  6. MongoDB学习:关闭mongod方式
  7. ASP.NET使用ConfigurationSection在Web.Config创建自定义配置节
  8. Toolbar的困惑
  9. 0. SQL Server监控清单
  10. 关于大规模 push 系统的解决方案