BuaacodingT651 我知道你不知道聖誕節做什麼 題解(邏輯)
阿新 • • 發佈:2018-11-26
題目連結
解題思路
第一句話:x,y不都為質數。
第二句話:對於xy=t,存在唯一一種x+y使得x,y不都為質數。
第三句話:對於x+y=s,存在唯一一種t=xy使得對於任意滿足xy=t的x和y,存在唯一一種x+y使得x,y不都為質數。
AC程式碼
/* Author: 牟鈺 Result: AC Submission_id: 1188891 Created at: Mon Nov 26 2018 12:44:11 GMT+0800 (CST) Problem_id: 651 Time: 5 Memory: 1464 */ #include<stdio.h> int prime[100]={2},cnt=1; int vis[210]; int main(){ int i,j; //篩選出不能表示為兩個質數和的情況 for(i=3;i<=100;i+=2){ int flag=0; for(j=0;prime[j]*prime[j]<=i;j++){ if(i%prime[j]==0){ flag=1; break; } } if(!flag)prime[cnt++]=i; } for(i=0;i<cnt;i++){ for(j=0;j<cnt;j++){ int p=prime[i]+prime[j]; if(p>200)break; vis[p]++; } } //篩選出對於任意xy滿足xy=i時,只有一組x+y不能表示為兩個質數之和的情況 int t[10000]={0},count=0; for(i=4;i<=99*99;i++){ int flag=0; for(j=2;j*j<=i;j++)if(i/j<=99&&i%j==0&&!vis[j+i/j])flag++; if(flag==1)t[i]=1; } //篩選出對於任意xy滿足x+y=i時,只有一組xy滿足上述篩的情況 int ans=0,ai[10]={0},ai2[10]={0}; for(i=4;i<=198;i++){ int flag=0,temp; if(vis[i])continue; for(j=2;j<=i/2;j++){ if(t[j*(i-j)]){ flag++; temp=j; } } if(flag==1){ ans++; ai[ans-1]=i; ai2[ans-1]=temp*(i-temp); } } printf("%d\n",ans); for(i=0;i<ans;i++){ printf("%d %d\n",ai[i],ai2[i]); } return 0; }