1. 程式人生 > >BuaacodingT651 我知道你不知道聖誕節做什麼 題解(邏輯)

BuaacodingT651 我知道你不知道聖誕節做什麼 題解(邏輯)

題目連結

我知道你不知道聖誕節做什麼

解題思路

第一句話: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;
}