标签:
Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 12496 | Accepted: 3330 |
Description
Input
Output
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
题目要求:给出两个数k和l,k是由两个素数相乘得到,如果素数小于l,输出BAD 和那个素数,否则输出GOOD。
先打出素数表,其中一定要有大于100万的素数,把在l内的素数与k去模,其中k是10^100用到大数取余,将k分为三位数的段a[0] a[1],在计算
temp = a[0]%phi[i]
temp = (a[1]*1000+temp)%phi[i]
#include <cstdio> #include <cstring> #include <algorithm> using namespace std ; #define LL __int64 char str[200] ; int n , a[100] , num ; int vis[2100000] , phi[1100000] , cnt ; void init() { int i , j ; cnt = 0 ; memset(vis,0,sizeof(vis)) ; for(i = 2 ; i <= 2000000 ; i++) { if( !vis[i] ) phi[cnt++] = i ; for(j = 0 ; j < cnt ; j++) { if( i*phi[j] >= 2000000 ) break ; vis[i*phi[j]] = 1 ; if( i%phi[j] == 0 ) break ; } } } int f(int k) { LL sum = 0 , i , l ; for(i = num-1 ; i >= 0 ; i--) { sum = sum*1000 + a[i] ; sum %= k ; } if( sum == 0 ) return 1 ; return 0; } int main() { int i , j , l , flag , s ; init() ; while( scanf("%s %d", str, &n) != EOF ) { if( strlen(str) == 1 && str[0] == '0' && n == 0 ) break ; l = strlen(str) ; memset(a,0,sizeof(a)) ; num = 0 ; flag = 0 ; for(i = l-1 ; i >= 0 ; i--) { flag++ ; if( flag == 3 ) { a[num] = (str[i]-'0')*100 + (str[i+1]-'0')*10 + ( str[i+2] -'0' ) ; num++ ; flag = 0 ; } } if( flag == 1 ) a[num++] = str[0] - '0' ; else if( flag == 2 ) a[num++] = (str[0] - '0') * 10 + str[1] - '0' ; for(i = 0 ; i < cnt ; i++) { if( phi[i] >= n ) break ; if( f(phi[i]) ) break ; } if( phi[i] >= n || i == cnt ) printf("GOOD\n") ; else printf("BAD %d\n", phi[i]); } return 0; }
poj2635--The Embarrassed Cryptographer(数论篇1,大数取模)
标签:
原文地址:http://blog.csdn.net/winddreams/article/details/43021933