The Embarrassed Cryptographer POJ - 2635 同余模+高精度处理 +线性欧拉筛(每n位一起处理)
Posted ttttttttrx
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了The Embarrassed Cryptographer POJ - 2635 同余模+高精度处理 +线性欧拉筛(每n位一起处理)相关的知识,希望对你有一定的参考价值。
题意:给出两数乘积K(1e100) 和 一个数L(1e6) 问有没有小于L(不能等于)的素数是K的因数
思路:把数K切割 用1000进制表示 由同余模公式知 k%x=(a*1000%x+b*1000*1000%x+c*1000*1000*1000%x....)
a b c等为 相应位置的三位数 这样切割可以减少模的次数 防止超时
1 #include<cstdio> 2 #include<cstring> 3 #include<vector> 4 #include<cmath> 5 #include<iostream> 6 using namespace std; 7 const int maxn=1e6+1000; 8 int primes[maxn]; 9 int vis[maxn]; 10 int cnt; 11 void init(){ 12 cnt=0; 13 for(int i=2;i<maxn;i++){ 14 if(!vis[i])primes[cnt++]=i; 15 for(int j=0;j<cnt&&i*primes[j]<maxn;j++){ 16 vis[i*primes[j]]=1; 17 if(i%primes[j]==0)break; 18 } 19 } 20 } 21 char k[1000]; 22 int kt[1000]; 23 int l; 24 int lenkt; 25 bool check(int prime){ 26 int ans=0; 27 for(int i=lenkt-1;i>=0;i--){ 28 ans=(ans*1000+kt[i])%prime; 29 } 30 if(ans==0)return 1; 31 return 0; 32 } 33 int main(){ 34 init(); 35 while(scanf("%s%d",k,&l)==2&&l&&k[0]!=‘0‘){ 36 int len=strlen(k); 37 memset(kt,0,sizeof(kt)); 38 for(int i=0;i<len;i++){ 39 int temp=(len-i+2)/3-1;//从后往前3个3个数 +2向上取整 40 kt[temp]=kt[temp]*10+k[i]-‘0‘; 41 } 42 lenkt=(len+2)/3;//+2是向上取整 43 int flag=0; 44 for(int i=0;i<cnt&&primes[i]<l;i++){ 45 if(check(primes[i])){ 46 printf("BAD %d ",primes[i]); 47 flag=1; 48 break; 49 } 50 51 } 52 if(!flag){ 53 printf("GOOD "); 54 } 55 } 56 return 0; 57 }
以上是关于The Embarrassed Cryptographer POJ - 2635 同余模+高精度处理 +线性欧拉筛(每n位一起处理)的主要内容,如果未能解决你的问题,请参考以下文章
[ACM] POJ 2635 The Embarrassed Cryptographer (同余定理,素数打表)
POJ 2635 The Embarrassed Cryptographer(大数求余)
POJ - 2635 The Embarrassed Cryptographer(千进制+同余模)
The Embarrassed Cryptographer POJ - 2635 同余模+高精度处理 +线性欧拉筛(每n位一起处理)
The goddess, the bird, the bell, the temptation of the house