hdu1999

来源:互联网 发布:澳大利亚房价走势知乎 编辑:程序博客网 时间:2024/05/13 03:50
/*
分析:
    n只有1000,暴力打表就行了。
    这里有半个结论,为什么说是半个呢,因为只说了符合结论中的两种情况的话,n是
可触摸数,但没有说反之则n不可触摸(不过可以ac= =I,数据水吧),反eg:t=7-1=6;t
不是素数、t也不可以被拆成两个不同的素数,由这个得出7是不可触摸数,但是S(8)==7,
所以。。。
    下面代码能ac,不过是错误的,懒得再写了,参考参考看看怎么错的吧= =I。
    下面是那个结论:
    “
      摘:
        设输入n,因为1是所有数的约数,首先t=n-1;
    如果此时 t 为素数,则n一定能被找到,eg:t*t,由于t是素数,t*t 的约数有且只有1和t,所以成立。
    否则,如果 t 能表示为两个互不相等的素数的和,则n一定找到。
    eg:i 为素数且t-i 也为素数,则 i*(n-i) 的约数一定只有 1,i ,t-i; 所以成立。
    但是,if(i==(t-i)),则不一定,因为相同素数只取一次。
    证毕。
    仅供参考,如有不妥之处,请指教!
    摘自:http://acm.hdu.edu.cn/forum/read.php?tid=8210
    ”




                                                     2013-05-09(改)
*/






#include"stdio.h"#include"string.h"int main(){int flag[1001];              //1代表可触摸int num[1001];int prime[222],k;int i,l,temp;int T;int n;memset(num,0,sizeof(num));memset(flag,0,sizeof(flag));num[0]=num[1]=1;k=0;for(i=2;i<=1000;i++){if(num[i]==0){for(temp=2*i;temp<=1000;temp+=i)num[temp]=1;flag[i+1]=1;            //1000肯定不是素数,所以不必加上“if(i+1)<=1000”了。prime[k]=i;k++;}}for(i=0;i<k;i++)for(l=i+1;l<k;l++){if(prime[i]+prime[l]+1<=1000)flag[prime[i]+prime[l]+1]=1;elsebreak;}scanf("%d",&T);while(T--){scanf("%d",&n);if(flag[n]==0)printf("yes\n");elseprintf("no\n");}return 0;}


原创粉丝点击