POJ2635(数论+欧拉筛+大数除法)
2024-09-04 02:22:08
题目链接:https://vjudge.net/problem/POJ-2635
题意:给定一个由两个质数积的大数M和一个数L,问大数M的其中较小的质数是否小于L。
题解:因为大数M已经超过long long 范围,那么我们就需要进行大数分解由十进制转换为1000进制,然后只要从2-L遍历一遍。
代码详情:
1 #include<iostream>
2 #include<algorithm>
3 #include<vector>
4 #include<cstring>
5 #include<cstdio>
6 #include<queue>
7 using namespace std;
8 #define mem(s,n) memset(s,n,sizeof s);
9 typedef long long ll;
10 const int maxn=2e6+100;
11 const int Inf=0x7f7f7f7f;
12 bool isprime[maxn];
13 int prime[maxn];
14 int cnt;
15 // 欧拉筛打表素数表;
16 void judge()
17 {
18 mem(isprime,1);
19 cnt=0;
20 isprime[1]=0;
21 for(int i=2;i<maxn;i++)
22 {
23 if(isprime[i]==1)
24 prime[cnt++]=i;
25 for(int j=0;j<cnt&&(i*prime[j])<maxn;j++)
26 {
27 isprime[i*prime[j]]=0;
28 if(i%prime[j]==0)
29 {
30 break;
31 }
32 }
33 }
34 }
35 int main()
36 {
37 char s[1005];
38 int n,k;
39 judge();
40 while(scanf("%s%d",s,&n)&&(s[0]!='0'&&n!=0))
41 {
42 int len=strlen(s);
43 for( k=2;k<n;k++)
44 {
45 if(isprime[k]==0) continue;
46 int num=0;
47 //大数分解;
48 for(int i=0;i<len;i+=3)
49 {
50 int t=0,ks=1;
51 for(int j=i;j<i+3&&j<len;j++) //转化为1000进制;
52 {
53 ks*=10;
54 t=t*10+s[j]-'0';
55 }
56 num=num*ks+t;
57 num%=k;
58 }
59 //关键;
60 if(num==0)
61 {
62 printf("BAD %d\n",k);
63 break;
64 }
65 }
66 if(k==n) puts("GOOD");
67 }
68 return 0;
69 }
最新文章
- Asp.Net Web API 2第五课——Web API路由
- hdoj 1729 Stone Games(SG函数)
- vb.net中的SqlHelper
- javaweb学习总结二十四(servlet经常用到的对象)
- python 错误处理
- android AsyncTask 详细例子
- Web性能优化工具WebPageTest(三)——本地部署(Windows 7版本)
- nmon进行性能分析
- WebService(1-1)webservice调用
- php中一些提高性能的技巧
- JeecgBoot版本4月份新版即将发布,抢先体验。。
- VMware 中安装虚拟机和宿主机通信
- Java access to the Domino Objects, Part 1
- 【Linux】通过SSH修改调整Linux时间和时区
- C++ 顺序表实现
- CentOS 启动-运行级别
- Windows API 编程----将错误代码转换成错误描述信息
- 基于Mysql-Proxy实现Mysql的主从复制以及读写分离(下)
- Walls and Gates -- LeetCode
- 最小生成树(prim和kruskal)