题目链接
解题思路
第一句话: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;
}