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;
}

猜你喜欢

转载自www.cnblogs.com/Potassium/p/10019714.html