poj2635
版权声明:本文为博主原创文章,未经博主同意不得转载。 https://blog.csdn.net/chaoweilanmao/article/details/33417423
这道题一看是大数题就知道不会做。就看了一下其它人的解题报告,千篇一律的做法:
首先把大数变成千进制数用整形数组存起来,事实上所谓千进制就是每三位数当作一位数处理。
然后从小到大枚举全部小于L的素数。用同余模的各种知识对这个转换后的千进制数进行求余,这个所谓同余模处理,事实上就是。设两个正整数a,b,c,有(a+b)%c=(a%c+b)%c,至于证明的话,
我不会。
最后呢,假设余数为0那么输出BAD 比L小的K质因子。假设不是的话,输出GOOD。
嗯,这样做就好了。至于为毛是千进制。事实上百进制,十进制都能够,用整形数组存起来表示即可了,不过千进制在这里是进行求余过程最优的方法,由于能使求余次数最少。那么为毛不能用万进制,由于会超精的。为毛?由于你想L最大是10的6次方,比它小的素数最大是有6位数的,于是每次对数组里面的每一个元素取完一次余,得到的最大余数最大也是有6位数的,于是之后
假设是万进制就要乘以10的4次方加上后面的数组元素,于是最多就会有10位数,int能表示的最大数是2的十次方的样子多一点,当然这里假设用long long的话是能够用万进制的,由于他们都是用千进制。所以。我不只用千进制的方法写了。还用万进制的方法写了。
附上千进制和万进制的两种做法的代码,事实上几乎相同,例如以下:
#include<iostream>
#include<cstring>
using namespace std;
int prime[1000000],sushu,l,num[110],shumu;
char k[110];
bool isprime(int x)
{
int i;
if(x%2==0)
return 0;
for(i=0;prime[i]*prime[i]<=x;i++)
if(x%prime[i]==0)
return 0;
return 1;
}
void makeprime()
{
int i;
prime[0]=2;
for(sushu=1,i=3;;i++)
if(isprime(i))
{
prime[sushu++]=i;
if(i>=1000000)
break;
}
}
void makenum()
{
bool flag=1;
int s,e,i,n=strlen(k),j,sum;
shumu=0;
for(e=n-1;flag;e=s-1)
{
if(e-2<=0)
{
s=0;
flag=0;
}
else
s=e-2;
sum=0;
for(j=s;j<=e;j++)
sum=sum*10+(k[j]-'0');
num[shumu++]=sum;
}
}
void iscunzai()
{
makenum();
int i,j,r;
for(i=0;prime[i]<l;i++)
{
r=0;
for(j=shumu-1;j>-1;j--)
r=(r*1000+num[j])%prime[i];
if(r==0)
{
printf("BAD %d\n",prime[i]);
return;
}
}
printf("GOOD\n");
}
int main()
{
makeprime();
while(scanf("%s%d",k,&l)&&(k[0]!='0'||l!=0))
{
iscunzai();
}
}
#include<iostream>
#include<cstring>
using namespace std;
int prime[1000000],sushu,l,num[110],shumu;
char k[110];
bool isprime(int x)
{
int i;
if(x%2==0)
return 0;
for(i=0;prime[i]*prime[i]<=x;i++)
if(x%prime[i]==0)
return 0;
return 1;
}
void makeprime()
{
int i;
prime[0]=2;
for(sushu=1,i=3;;i++)
if(isprime(i))
{
prime[sushu++]=i;
if(i>=1000000)
break;
}
}
void makenum()
{
bool flag=1;
int s,e,i,n=strlen(k),j,sum;
shumu=0;
for(e=n-1;flag;e=s-1)
{
if(e-3<=0)
{
s=0;
flag=0;
}
else
s=e-3;
sum=0;
for(j=s;j<=e;j++)
sum=sum*10+(k[j]-'0');
num[shumu++]=sum;
}
}
void iscunzai()
{
makenum();
int i,j;
long long r;
for(i=0;prime[i]<l;i++)
{
r=0;
for(j=shumu-1;j>-1;j--)
r=(r*10000+num[j])%prime[i];
if(r==0)
{
printf("BAD %d\n",prime[i]);
return;
}
}
printf("GOOD\n");
}
int main()
{
makeprime();
while(scanf("%s%d",k,&l)&&(k[0]!='0'||l!=0))
{
iscunzai();
}
}
另外从这里http://blog.csdn.net/lyy289065406/article/details/6648530学到了一个推断素数的比較快的方法,就是首先推断这个数是不是偶数,假设不是再枚举小于或等于这个数的平方根的素数,看是不是能够使这个数被整除。假设再不是,那么这个数肯定是素数了。
poj2635的更多相关文章
- POJ2635——The Embarrassed Cryptographer(高精度取模+筛选取素数)
The Embarrassed Cryptographer DescriptionThe young and very promising cryptographer Odd Even has imp ...
- POJ2635(数论+欧拉筛+大数除法)
题目链接:https://vjudge.net/problem/POJ-2635 题意:给定一个由两个质数积的大数M和一个数L,问大数M的其中较小的质数是否小于L. 题解:因为大数M已经超过long ...
- (POJ2635)The Embarrassed Cryptographer(大数取模)
The Embarrassed Cryptographer Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 13041 Accep ...
- poj2635 同余定理 + 素数筛法
题意:给定一个数,这个数是两个素数的乘积,并给定一个限制L,问是否两个素数中存在小于L的数,若存在输出较小质数,否则打印'GOOD'. 思路: 1 . x = a * b, a和b都是素数,那么x只能 ...
- poj2635(千进制取模+同余模定理)
题目链接:https://www.cnblogs.com/kuangbin/archive/2012/04/01/2429463.html 题意:给出大数s (s<=10100) ,L (< ...
- poj题目
poj2965 poj1753:标准的BFS+位运算优化 poj1328:线段覆盖变种,把圆对应到线段上,贪心求解 poj2109:高精度开根,二分+高精度,注意要判断答案的位数,如果按照题目给的范围 ...
- poj分类 很好很有层次感。
初期: 一.基本算法: (1)枚举. (poj1753,poj2965) (2)贪心(poj1328,poj2109,poj2586) (3)递归和分治法. ( ...
- 【转】POJ题目分类推荐 (很好很有层次感)
OJ上的一些水题(可用来练手和增加自信) (poj3299,poj2159,poj2739,poj1083,poj2262,poj1503,poj3006,poj2255,poj3094)初期: 一. ...
- 【转】ACM训练计划
[转] POJ推荐50题以及ACM训练方案 -- : 转载自 wade_wang 最终编辑 000lzl POJ 推荐50题 第一类 动态规划(至少6题, 和 必做) 和 (可贪心) (稍难) 第二类 ...
随机推荐
- [PHP] 算法-顺时针打印矩阵的PHP实现
1.行数和列数取出来row,col,圈数就是 (较小值-1)/2+1 2.外层循环控制圈数,内层四个for循环,i 3.第一个for循环,从左到右,j=i;j<col-i;j++;j<; ...
- Java高并发 -- J.U.C.组件扩展
Java高并发 -- J.U.C.组件扩展 主要是学习慕课网实战视频<Java并发编程入门与高并发面试>的笔记 FutureTask Future模式,核心思想是异步调用.和同步调用的区别 ...
- Netty实战四之传输
流经网络的数据总是具有相同的类型:字节(网络传输——一个帮助我们抽象底层数据传输机制的概念) Netty为它所有的传输实现提供了一个通用的API,即我们可以将时间花在其他更有成效的事情上. 我们将通过 ...
- 安装PyCharm
安装包下载 本文以CentOS上PyCharm安装为例来介绍,安装包的下载地址:https://www.jetbrains.com/pycharm/download/ 官网提供了windows,mac ...
- js之单例模式
单例模式是指一个类,只有一个实例.实现的思路是,创建实例时候加判断,如果有实例则返回,如果没有就new一个,并返回. 第一步: 创建类. function Waiter(id, name, salar ...
- JavaScript Array常用属性和方法
Array的length属性可以通过赋值改变,但这样会导致Array原有的大小发生改变. var a = ["I", "Love", "You&quo ...
- 2018-11-23 手工翻译Vue.js源码:尝试重命名标识符与文本
续前文: 手工翻译Vue.js源码第一步:14个文件重命名 对core/instance/索引中的变量, 方法进行重命名如下(题图): import { 混入初始化 } from './初始化' im ...
- SAP MM ME57 把PR转成PO
SAP MM ME57 把PR转成PO 加入P3项目里,笔者负责采购和IM库存管理domain.采购环节里的PR转PO,客户global template里建议使用ME57或者在MD04里做.笔者在项 ...
- 2.Odoo产品分析 (一) – 一切为零
查看Odoo产品分析系列--目录 1. 默认数据库 声明在先 本系列文档(Odoo产品分析)整理来自本人对该ERP的理解,并结合文档Working-with-Odoo-10-Second-Editi ...
- iOS ---------NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9813)
遇到此问题的解决办法: 使用<NSURLSessionDelegate>中的didReceiveChallenge方法,方法中的代码如下: - (void)URLSession:(NSUR ...