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题, 和 必做) 和 (可贪心) (稍难) 第二类 ...
随机推荐
- 25.QT-模型视图
模型视图设计模式的核心思想 使模型(数据)与视图(显示)相分离 模型只需要对外提供标准接口存取数据,无需数据如何显示 视图只需要自定义数据的显示方式,无需数据如何组织存储 当数据发生改变时,会通过信号 ...
- QueryRunner使用之可变条件的处理
在三层架构的Dao层中,需要通过不确定的条件,从数据库查询结果. 可以利用List集合作为容器将条件存储起来. 实际开发中的代码: public List<Hotel> searchByF ...
- Java学习笔记之——自动装箱与拆箱
自动装箱与拆箱 基本类型与引用类型的互相转换 1. 基本类型对应的包装类 byte short char int long flaot double ...
- Object类型转换成自定义类型(向下转型)
Object类型转换成自定义类型 场景: 从数据库或者别的途径接收对象的时候用Object,但是用的时候怎么object点(方法提示 | alt+'/'),都点不出自定义类型的方法. 比如,数据库查询 ...
- matlab rank
k =rank(A) %a is matrix s = svd(A); tol = max(size(A))*eps(max(s)); r = sum(s > tol);
- 学用纯CSS打造可折叠树状菜单
随着CSS3的发布,国外研究正如火如荼,但在国内还有很多人抱着IE不支持CSS3的想法,始终无动于衷不肯去学习.但是历史告诉我们,好的东西必将盛行,CSS3也终将也会替代CSS2,下面就和大家分享一个 ...
- [代码笔记]VUE路由根据返回状态判断添加响应拦截器
//返回状态判断(添加响应拦截器) Axios.interceptors.response.use( res => { //对响应数据做些事 if (res.data && !r ...
- Python3.6 下 安装MySql
https://pypi.python.org/pypi/mysqlclient/1.3.10 该网页下下载 Python-3.5及上版本的扩展的mysql驱动. 下载的是一个.whl文件,下载目录为 ...
- Java根据年龄段获取对应年份起始时间戳和最终时间戳、根据生日时间戳获取月份(与数据库的时间戳处理成的月份拼接成SQL条件)
1.传入年龄段,两个值,一个最小值,一个最大值,然后获取该年龄段的两个时间戳: (1)处理时间方法: /** * 根据年龄获取时间戳(开始年龄key取0,返回一年最后一秒时间戳,时间戳大:反之结束年龄 ...
- 官网下载的Struts 2解压后缺少xwork-core.jar文件
为Eclipse配置Struts-2.5.10所需最少jar文件: 缺少的文件已被合并在struts2-core-2.5.10.jar文件中.我下的是最新版的,如果你下的找不到就是这个原因啦.