首页 > 其他 > 详细

CodeForcesGym 100753K Upside down primes

时间:2015-10-05 20:43:44      阅读:452      评论:0      收藏:0      [点我收藏+]

Upside down primes

Time Limit: 2000ms
Memory Limit: 262144KB
This problem will be judged on CodeForcesGym. Original ID: 100753K
64-bit integer IO format: %I64d      Java class name: (Any)
技术分享
 
解题:大数素性测试
技术分享
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long LL;
 4 LL mul(LL a,LL b,LL mod) {
 5     if(!a) return 0;
 6     return ((a&1)*b%mod + (mul(a>>1,b,mod)<<1)%mod)%mod;
 7 }
 8 LL quickPow(LL a,LL d,LL n){
 9     LL ret = 1;
10     while(d){
11         if(d&1) ret = mul(ret,a,n);
12         d >>= 1;
13         a = mul(a,a,n);
14     }
15     return ret;
16 }
17 bool check(LL a,LL d,LL n){
18     if(n == a) return true;
19     while(~d&1) d >>= 1;
20     LL t = quickPow(a,d,n);
21     while(d < n-1 && t != 1 && t != n-1){
22         t = mul(t,t,n);
23         d <<= 1;
24     }
25     return (d&1)||t == n-1;
26 }
27 bool isP(LL n){
28     if(n == 2) return true;
29     if(n < 2 || 0 == (n&1)) return false;
30     static int p[10] = {2,3,5,7,11,61,24251};
31     for(int i = 0; i < 7; ++i)
32         if(!check(p[i],n-1,n)) return false;
33     return true;
34 }
35 
36 bool trans(LL x){
37     char str[100];
38     sprintf(str,"%I64d",x);
39     for(int i = 0; str[i]; ++i)
40         if(str[i] == 3 || str[i] == 4 || str[i] == 7) return false;
41     reverse(str,str + strlen(str));
42     for(int i = 0; str[i]; ++i)
43         if(str[i] == 6) str[i] = 9;
44         else if(str[i] == 9) str[i] = 6;
45     sscanf(str,"%I64d",&x);
46     return isP(x);
47 }
48 int main(){
49     LL x;
50     while(~scanf("%I64d",&x)){
51         if(isP(x) && trans(x)) puts("yes");
52         else puts("no");
53     }
54     return  0;
55 }
View Code

 

CodeForcesGym 100753K Upside down primes

原文:http://www.cnblogs.com/crackpotisback/p/4856168.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!