The Embarrassed Cryptographer
Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 13032 | Accepted: 3515 |
Description
题意:给定一个数<10的100次幂,求在n范围内是否存在该数的质因子;
思路:同余模的高进制;

What Odd Even did not think of, was that both factors in a key should be large, not just their product. It is now possible that some of the users of the system have weak keys. In a desperate attempt not to be fired, Odd Even secretly goes through all the users keys, to check if they are strong enough. He uses his very poweful Atari, and is especially careful when checking his boss' key.
Input
The input consists of no more than 20 test cases. Each test case is a line with the integers 4 <= K <= 10
100 and 2 <= L <= 10
6. K is the key itself, a product of two primes. L is the wanted minimum size of the factors in the key. The input set is terminated by a case where K = 0 and L = 0.
Output
For each number K, if one of its factors are strictly less than the required L, your program should output "BAD p", where p is the smallest factor in K. Otherwise, it should output "GOOD". Cases should be separated by a line-break.
Sample Input
143 10 143 20 667 20 667 30 2573 30 2573 40 0 0
Sample Output
GOOD BAD 11 GOOD BAD 23 GOOD BAD 31
Source
Nordic 2005
10000进制版;
100000版
10000进制版;
Source Code
Problem: 2635 User: 14110103069
Memory: 2268K Time: 860MS
Language: G++ Result: Accepted
Source Code
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<set>
#include<map>
#include<cctype>
#define LL long long
#define INF 0x3f3f3f3f
using namespace std;
const int N = 1e6+1e4;
LL prime[N>>2];
bool flag[N];
int k;
char s[110];
LL a[110];
void getprime()
{
k=0;
memset(flag,0,sizeof(flag));
int i,j;
for(i=2;i<N;i++)
{
if(!flag[i])
{
prime[++k]=i;
}
for(j=1;j<=k&&prime[j]*i<N;j++)
{
flag[prime[j]*i]=1;
if(i%prime[j]==0)
break;
}
}
}
int main()
{
getprime();
int n;
while(~scanf("%s%d",s,&n))
{
if(s[0]=='0'&&n==0)
break;
int len=strlen(s);
int i=0;
int l=0,j;
LL tmp;
bool first=1;
while(i<len)
{
j=4;
tmp=0;
if(first)
{
j=len%4;
}
if(j==0)
j=4;
while(i<len&&j>0)
{
tmp=tmp*10+s[i]-'0';
i++;j--;
}
first=0;
a[++l]=tmp;
}
first =1;
for( i=1;prime[i]<n;i++)
{
tmp=0;
for( j=1;j<=l;j++)
{
tmp=(tmp*10000+a[j])%prime[i];
}
if(tmp==0)
{
first=0;
break;
}
}
if(first)
printf("GOOD\n");
else
printf("BAD %lld\n",prime[i]);
}
return 0;
}
100000版
Source Code
Problem: 2635 User: 14110103069
Memory: 2268K Time: 688MS
Language: G++ Result: Accepted
Source Code
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<set>
#include<map>
#include<cctype>
#define LL long long
#define INF 0x3f3f3f3f
using namespace std;
const int N = 1e6+1e4;
LL prime[N>>2];
bool flag[N];
int k;
char s[110];
LL a[110];
void getprime()
{
k=0;
memset(flag,0,sizeof(flag));
int i,j;
for(i=2;i<N;i++)
{
if(!flag[i])
{
prime[++k]=i;
}
for(j=1;j<=k&&prime[j]*i<N;j++)
{
flag[prime[j]*i]=1;
if(i%prime[j]==0)
break;
}
}
}
int main()
{
getprime();
int n;
while(~scanf("%s%d",s,&n))
{
if(s[0]=='0'&&n==0)
break;
int len=strlen(s);
int i=0;
int l=0,j;
LL tmp;
bool first=1;
while(i<len)
{
j=5;
tmp=0;
if(first)
{
j=len%5;
first=0;
}
if(j==0)
j=5;
while(i<len&&j>0)
{
tmp=tmp*10+s[i]-'0';
i++;j--;
}
a[++l]=tmp;
}
first =1;
for( i=1;prime[i]<n;i++)
{
tmp=0;
for( j=1;j<=l;j++)
{
tmp=(tmp*100000+a[j])%prime[i];
}
if(tmp==0)
{
first=0;
break;
}
}
if(first)
printf("GOOD\n");
else
printf("BAD %lld\n",prime[i]);
}
return 0;
}
1000000版
Source Code
Problem: 2635 User: 14110103069
Memory: 2268K Time: 610MS
Language: G++ Result: Accepted
Source Code
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<set>
#include<map>
#include<cctype>
#define LL long long
#define INF 0x3f3f3f3f
using namespace std;
const int N = 1e6+1e4;
LL prime[N>>2];
bool flag[N];
int k;
char s[110];
LL a[110];
void getprime()
{
k=0;
memset(flag,0,sizeof(flag));
int i,j;
for(i=2;i<N;i++)
{
if(!flag[i])
{
prime[++k]=i;
}
for(j=1;j<=k&&prime[j]*i<N;j++)
{
flag[prime[j]*i]=1;
if(i%prime[j]==0)
break;
}
}
}
int main()
{
getprime();
int n;
while(~scanf("%s%d",s,&n))
{
if(s[0]=='0'&&n==0)
break;
int len=strlen(s);
int i=0;
int l=0,j;
LL tmp;
bool first=1;
while(i<len)
{
j=6;
tmp=0;
if(first)
{
j=len%6;
first=0;
}
if(j==0)
j=6;
while(i<len&&j>0)
{
tmp=tmp*10+s[i]-'0';
i++;j--;
}
a[++l]=tmp;
}
first =1;
for( i=1;prime[i]<n;i++)
{
tmp=0;
for( j=1;j<=l;j++)
{
tmp=(tmp*1000000+a[j])%prime[i];
}
if(tmp==0)
{
first=0;
break;
}
}
if(first)
printf("GOOD\n");
else
printf("BAD %lld\n",prime[i]);
}
return 0;
}