POJ2635 The Embarrassed Cryptographer 简单数论

题目链接

看到这题的示意图也是醉了~题意:给你一个k,他是两个素数之积,然后给了一个数字L,然后找到具体是哪两个素数相乘等于k,较小的那个素数是否小于L,若小于L就输出 "BAD"外加较小的那个素数,否则就输出“GOOD”,

刚拿到这题目,有些钻牛角尖外加题意没看清楚,一开始纠结于 K很大,若想具体找出两个素数不可能,因为总有一个很大很大,求出其中一个素数 是否在10^6内是可以的,但是那时候我觉得还需要证明 k/prime  的值必须也是素数才符合要求,其实题目都规定好了 k必定是两个素数之积 而不会由其它合数相乘构成,所以就简单了许多

我不知道这个是什么定理的,但是对于一个很长的数字 比如  123456789,若把它每位上数字存在数组num中,123456789%m也等于

int now = 0;

for(int i=0;i<9;i++) now = (now * 10 + num[i])%m;

如果知道这个的话就好做了,对于K其实可以转化为大进制的数字存在数组里,比如转化为千进制万进制,先保存好,最后 计算的时候再乘以一千或者一万,上面那个for是相对于十进制的,把那个now*10改成对应进制即可,剩下的枚举素数只需要打印素数表即可,一开始害怕K太大存不下来而没有去细算直接转化为万进制,结果一直WA,后来转化为千进制就过了,原因是 for循环时每次取余的时候,余数最大可达10^6,然后再乘10000就会爆int,然后又改成了 long
long,转化为万进制,也是可以过的

string s;

int L;

int nnum[100000 + 5];

int cnt ;

bool isprime[1000000 + 55];
int prime[1000000 + 55];
int k;

void make_prime() {
	memset(isprime,false,sizeof(isprime));
	for(int i=2;i<1000055 ;i++)
		if(!isprime[i])
			for(int j=i*2;j<1000055;j+=i)
				isprime[j]=true;
	for(int i=2;i<1000055;i++)
		if(!isprime[i])
			prime[k++]=i;
}

void init() {
	memset(nnum,0,sizeof(nnum));
	cnt = 0;
}

bool input() {
	while(cin>>s>>L) {
		if(s == "0" && L == 0)break;
		return false;
	}
	return true;
}

void slove() {
	int len = s.length();
	for(int i=len - 1;i >= 0;i-=3) {
		for(int j= i - 2;j<=i;j++) {
			if(j < 0)j = 0;
			nnum[cnt] = nnum[cnt] * 10 + s[j] - '0';
		}
		cnt++;
	}
}

bool gao(int x) {
	int ret = 0;
	for(int i= cnt - 1;i>=0;i--) {
		ret = (ret * 1000 + nnum[i])%x;
	}
	if(ret)return false;
	return true;
}

void cal() {
	slove();
	for(int i=0;i<k && prime[i] < L;i++) {
		if(gao(prime[i])) {
			printf("BAD %d\n",prime[i]);
			return ;
		}
	}
	puts("GOOD");
}

void output() {

}

int main() {
	make_prime();
	while(true) {
		init();
		if(input())return 0;
		cal();
		output();
	}
	return 0;
}
时间: 2024-08-04 05:29:27

POJ2635 The Embarrassed Cryptographer 简单数论的相关文章

poj2635(The Embarrassed Cryptographer)

题目地址:The Embarrassed Cryptographer 题目大意: 给定一个大数K,K是两个大素数的乘积的值.再给定一个int内的数L问这两个大素数中最小的一个是否小于L,如果小于则输出这个素数. 解题思路: 高精度求模+同余模定理 同余模定理: 例如要验证123是否被3整除,只需求模124%3 但当123是一个大数时,就不能直接求,只能通过同余模定理对大数“分块”间接求模 具体做法是: 先求1%3 = 1 再求(1*10+2)%3 = 0 再求 (0*10+4)% 3 = 1 那

poj2635--The Embarrassed Cryptographer(数论篇1,大数取模)

The Embarrassed Cryptographer Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 12496   Accepted: 3330 Description The young and very promising cryptographer Odd Even has implemented the security module of a large system with thousands of

[ACM] POJ 2635 The Embarrassed Cryptographer (同余定理,素数打表)

The Embarrassed Cryptographer Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 11978   Accepted: 3194 Description The young and very promising cryptographer Odd Even has implemented the security module of a large system with thousands of

hdu 1395 2^x mod n = 1 (简单数论)

题目大意: 求出一个最小的x 使得 2的x次方对n取模为1 思路分析: 若要 a*b%p=1  要使得b存在 则 gcd (a,p)=1. 那么我们应用到这个题目上来. 当n为偶数 2^x 也是偶数,那么gcd 肯定不是1.故这个是不存在的. 那么n为奇数的时候,也就一定是1了. 所以直接暴力找. #include <iostream> #include <cstdio> using namespace std; int main() { int n; while(scanf(&q

HDOJ 题目2303 The Embarrassed Cryptographer(数学)

The Embarrassed Cryptographer Time Limit: 3000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 563    Accepted Submission(s): 172 Problem Description The young and very promising cryptographer Odd Even has impl

HDOJ 1163 Eddy&#39;s digital Roots(简单数论)

[思路]:http://blog.csdn.net/iamskying/article/details/4738838 求解思路: 现在分析一个问题,假设将十位数为a,个位数为b的一个整数表示为ab,则推导得 ab*ab = (a*10+b)*(a*10+b) = 100*a*a+10*2*a*b+b*b 根据上式可得:root(ab*ab) = a*a+2*a*b+b*b = (a+b)*(a+b);[公式一] 同理也可证得:root(ab*ab*ab) = (a+b)*(a+b)*(a+b)

POJ 2635 The Embarrassed Cryptographer(高精度取模 + 同余模定理)

The Embarrassed Cryptographer Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 12905   Accepted: 3472 Description The young and very promising cryptographer Odd Even has implemented the security module of a large system with thousands of

poj 2635 The Embarrassed Cryptographer

题目链接:http://poj.org/problem?id=2635 思路:当看到K的最大值为 10100 的第一想法就是用java打大数,建立一个素数表,然后再在素数表中去找,看是否有符合条件的. code: import java.math.*; import java.util.*; public class ggg { public static void main(String[] args) { int len=0; Scanner cin=new Scanner(System.i

POJ 2635-The Embarrassed Cryptographer(高精度求模+同余模定理)

The Embarrassed Cryptographer Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 2635 Appoint description:  System Crawler  (2015-05-28) Description The young and very promising cryptographer Odd E