HDU 1999 不可摸数
2012-08-14 09:53
274 查看
地址:http://acm.hdu.edu.cn/showproblem.php?pid=1999
思路1:
标准的筛选法。求出每个数的因子和,
然后看因子和是否在1000以内,是的话就证明等于因子和的这个数不是不可摸数。
思路2:
设输入n,因为1是所有数的约数,首先t=n-1;
如果此时 t 为素数,则n一定能被找到,eg:t*t,由于t是素数,t*t 的约数有且只有1和t,所以成立。
否则,如果 t 能表示为两个互不相等的素数的和,则n一定找到。
eg:i 为素数且t-i 也为素数,则 i*(t-i) 的约数一定只有 1,i ,t-i; 所以成立。
但是,if(i==(t-i)),则不一定,因为相同素数只取一次。
证毕。
思路1:
标准的筛选法。求出每个数的因子和,
然后看因子和是否在1000以内,是的话就证明等于因子和的这个数不是不可摸数。
#include<stdio.h> #include<string.h> #include<math.h> int sum[1000001],sign[1001]; //sum是因子数和,开的空间大些 int main() { int n,num,i,j; scanf("%d",&n); for(i=1;i<=500000;++i) for(j=2*i;j<=1000000;j+=i) sum[j]+=i; //这个过程是用筛选法求出每个数的因子和 for(i=1;i<=1000000;++i) if(sum[i]<1000) sign[sum[i]]=1; //说明在1000里存在一个数等于,则不是不可模数 while(n--) { scanf("%d",&num); if(sign[num]) puts("no"); else puts("yes"); } return 0; }
思路2:
设输入n,因为1是所有数的约数,首先t=n-1;
如果此时 t 为素数,则n一定能被找到,eg:t*t,由于t是素数,t*t 的约数有且只有1和t,所以成立。
否则,如果 t 能表示为两个互不相等的素数的和,则n一定找到。
eg:i 为素数且t-i 也为素数,则 i*(t-i) 的约数一定只有 1,i ,t-i; 所以成立。
但是,if(i==(t-i)),则不一定,因为相同素数只取一次。
证毕。
#include<stdio.h> int main() { int i,j,n,prime[1000]={1,1}; for(i=2;i<1000;++i) if(!prime[i]) for(j=i+i;j<1000;j+=i) prime[j]=1; scanf("%d",&j); while(j--){ scanf("%d",&n); if(!prime[--n]){ puts("no"); continue; } for(i=2;i<=(n>>1);++i) if(!prime[i]&&!prime[n-i]) break; if(i<=(n>>1)&&n!=(i<<1)) puts("no"); else puts("yes"); } return 0; }
相关文章推荐
- HDU 1999 不可摸数 (约数和。。)
- hdu 1999 不可摸数(朴素打表法求质因子之和)
- hdu 1999 不可摸数
- 不可摸数HDU-1999
- hdu 1999 不可摸数 筛选素数 两次打表
- HDU 1999 不可摸数(数论)
- hdu 1999 不可摸数
- hdu——1999(不可模数 )
- hdu 1999 不可摸数
- hdu 1999 不可摸数
- hdu 1999-不可摸数
- HDU 1999 不可摸数 (乱搞)
- hdu 1999 不可摸数
- hdu 1999 不可摸数 水题。
- hdu 1999-不可摸数
- hdu 1999 不可摸数 筛选素数 两次打表
- HDU--1999-不可摸数
- HDU 1999 不可摸数 (一道令我疑惑的题目)
- hdu-1999-不可摸数
- 不可摸数 HDU - 1999