记录编号 199539 评测结果 AAAAAAAAA
题目名称 [USACO 1.5] 回文质数 最终得分 100
用户昵称 GravatarSkyo 是否通过 通过
代码语言 C++ 运行时间 0.015 s
提交时间 2015-10-26 21:44:28 内存使用 0.29 MiB
显示代码纯文本
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long L;

int a, b; 
int t[5] = {2,3,5,7,11}, A[5] = {2,3,7,61,24251};

int Create(int x, int mid)
{
	int res = x*10+mid;
	while(x) res = res*10+x%10, x /= 10;
	return res;
}

int gcd(int x, int y) {return y ? gcd(y, x%y) : x;}

L pow(L x, int y, L mod)
{
	if(y == 0) return 1;
	if(y == 1) return x;
	L t = pow(x, y>>1, mod);
	if(y&1) return (t*x%mod)*t%mod;
	return t*t%mod;
}

bool Prime(int x)
{
	int s = 0, r, mod = x--, i, j;
	while(!(x&1)) s++, x>>=1;
	r = x;
	
	for(i = 0; i < 5; i++)
	{
		if(pow((L)A[i], r, (L)mod) == 1) continue;
		L res = pow((L)A[i], r, (L)mod);
		for(j = 0; j < s; j++)
		{
			if(res == mod-1) break;
			res = res*res%mod;
		}
		if(j == s) return 0;
	}
	return 1;
}

void Initialize()
{
	freopen("pprime.in", "r", stdin);
	freopen("pprime.out", "w", stdout);
	scanf("%d %d", &a, &b);
	for(int i = 0; i < 5; i++)
		if(a <= t[i]) printf("%d\n", t[i]);
}

void Create_num(int len, int ed, int x)
{
	if(len == ed)
	{
		for(int i = 0; i <= 9; i++)
		{
			int num = Create(x, i);
			if(a <= num && num <= b && Prime(num)) printf("%d\n", num);
		}
		return ;
	}
	
	if(ed) for(int i = 0; i <= 9; i++) Create_num(len, ed+1, x*10+i);
	else for(int i = 1; i <= 9; i+=2) if(i != 5) Create_num(len, ed+1, x*10+i);
}

int main()
{
	Initialize();	
	if(a <= 999 && b >= 100) Create_num(1, 0, 0);
	if(a <= 99999 && b >= 10000) Create_num(2, 0, 0);
	if(a <= 9999999 && b >= 1000000) Create_num(3, 0, 0);
	return 0;
}