Description
Staginner总是喜欢把自已的名字写在他出的题目里。CSU-ACM协会的会长想,这孩子是不是想出名想疯了,于是决定考一考他。
任意正整数N,不大于N且与N互质的正整数个数记为P,现在给一列与N互质的正整数,只知道一些数各出现P次,而有两个数各只出现了1次,求这两个数。
会长对Staginner说,你要是解出了这个题,这道题也加上你的名字。
Staginner要求道,很多数啊,那你得跟我说两遍。
打赌的结果大家已经看到了,那么你能不能解决这个问题呢?
Input
多组数据, 每组数据两行,第一行为两个正整数N、K,2 < N < 2^11,1 < K < 2^18
第二行K个正整数X,1 < X < 2^30,第三行重复这K个数
Output
输出只出现一次的两个数,小的在前,一个空格隔开。
Sample Input
8 6
5 5 5 5 3 7
5 5 3 5 5 7
7 14
1 1 1 1 1 1 9 6 3 3 3 3 3 3
1 1 9 1 1 1 1 6 3 3 3 3 3 3
Sample Output
3 7
6 9
HINT
#include <stdio.h>
#include <cmath>
using namespace std;
int prime[1024];
int times[1024];
int temp,num;
int len;
void init()
{
len = 0;
for(int i =0;i<1024;i++)
{
prime[i]=0;
times[i]=0;
}
}
bool exist(int n)
{
for(int i =0;i<len;i++)
{
if(prime[i]==n)
return true;
}
return false;
}
int main()
{
int N,K;
while(scanf("%d%d",&N,&K) != EOF)
{
init();
for(int i =0;i<K;i++)
{
scanf("%d",&num);
if(exist(num)==false)
{
prime[len]=num;
len++;
}
}
for(int i =0;i<K;i++)
{
scanf("%d",&temp);
for(int i =0;i<K;i++)
{
if(temp==prime[i])
{
times[i]++;
break;
}
}
}
int a[2];
int j = 0;
for(int i =0;i<len;i++)
{
if(times[i]==1)
{
a[j]=prime[i];
j++;
}
if(j==2)
break;
}
int x = a[0]<a[1]?a[0]:a[1];
int y = a[0]+a[1]-x;
printf("%d %d\n",x,y);
}
return 0;
}