题解蓝桥杯比赛真题(更新中)

第一题  寻找整数

有一个不超过 10^{17}的正整数 n,知道这个数除以 2 至 49 后的余数如下表所示,求这个正整数最小是多少。

题解蓝桥杯比赛真题(更新中)_第1张图片

一元线性同余方程组问题最早可见于中国南北朝时期(公元5世纪)的数学著作《孙子算经》卷下第二十六题,叫做“物不知数”问题,原文如下:有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二。问物几何?即,一个整数除以三余二,除以五余三,除以七余二,求这个整数。

直接求解是不现实的,n的值范围虽然限制在10^17范围内,但依然很大,所以想办法把步长拉长。

中国剩余定理的解是  k \quad mod \quad (2*3*4*5*\cdots*49),  思路就是先求前面部分的模组的部分解,然后利用这个解,加大步长。

int find_small_integer()
{
	long long a = 100000000000000000;

	for (long i = 187; i <= a; i += 374)
	{
		if (i % 3 != 2 || i % 4 != 1 || i % 5 != 4 || i % 6 != 5 || i%7!=4 || i % 8 != 1 && i % 9 == 2)
			continue;
		if (i % 10 != 9 || i % 12 != 5 || i % 13 != 10 || i % 14 != 11 || i % 15 != 14 || i % 16 != 9 && i % 18 == 11)
			continue;
		if (i % 19 != 18 || i % 20 != 9 || i % 21 != 11 || i % 22 != 11 || i % 23 != 15 || i % 24 != 17 && i % 25 == 9)
			continue;
		return  i;
		
	}

}

void fin_integer()
{
	long long start = find_small_integer();
	long long a = 100000000000000000;
	long long step = 3 * 5 * 7 * 13 * 17 * 19 * 23*11;
	for (long long i = start; i < a; i+= step)
	{
		if (i % 26 != 23 || i % 27 != 20 || i % 28 != 25 || i % 29 != 16 || i % 30 != 29)
			continue;
		if(i%31!=27 ||i%32!=25||i%33!=11|| i%34!=17 ||i%35!=4)
			continue;
		if(i%36!=29 || i%37!=22 || i%38!=37||i%39!=23 || i%40!=9 || i%41!=1)
			continue; 
		if(i%42!=11 || i%43!=11 || i%44!=33 || i%45!=29 || i%46!=15)
			continue; 
		if (i%47 != 5 || i % 48 != 41 || i%49 != 46)
			continue;
		cout << i;
		
	}
}

第二题  星期计算

已知今天是星期六,请问20^{22} 天后是星期几?

注意用数字 1 到 7 表示星期一到星期日。

20^{22} \quad mod \quad 7 =(-1)^{22}=1 \quad mod \quad 7

第三题  等差素数列

2,3,5,7,11,13,.... 是素数序列。 类似:7,37,67,97,127,1577,37,67,97,127,157 这样完全由素数组成的等差数列,叫等差素数数列。

上边的数列公差为 30,长度为 6。

2004年,格林与华人陶哲轩合作证明了:存在任意长度的素数等差数列。 这是数论领域一项惊人的成果!

有这一理论为基础,请你借助手中的计算机,满怀信心地搜索:

长度为 10 的等差素数列,其公差最小值是多少?

就是恰当的进行穷举法

int isprime(int n)
{
	int tmp = sqrt(n);
	for (int i = 2; i <= tmp; i++)
		if (n%i == 0) return 0;
	return 1;
}


int gongchazuixiaozhi() //长度为 10 的等差素数列,其公差最小值是多少?
{
	int times;
	for (int i = 3; i<10000000; i += 2)
	{
		if (isprime(i))
		{
			for (int d = 2; d<50000; d += 2)
			{
				for (times = 0; times<10; times++)
					if (!isprime(times*d + i))
						break;
				if (times == 10) {
					cout << d;
					return 0;
				}
			}

		}

	}

	return 0;
	
}

第四题 排列序数

如果用 a b c d 这 4 个字母组成一个串,有 4!=24 种,如果把它们排个序,每个串都对应一个序号:

abcd 0

abdc 1

acbd 2

acdb 3

adbc 4

adcb 5

bacd 6

badc 7

bcad 8

bcda 9

bdac 10

bdca 11

cabd 12

cadb 13

cbad 14

cbda 15

cdab 16

cdba 17

⋯⋯

现在有不多于 10 个两两不同的小写字母,给出它们组成的串,你能求出该串在所有排列中的序号吗?

输入描述

输入一行,一个串。

输出描述

输出一行,一个整数,表示该串在其字母所有排列生成的串中的序号。注意:最小的序号是 0。

void permuation_order()
{
	string str;
	cin >> str;
	int order = 0;
	char *a = new char[str.length()];
	for (int i = 0; i < str.length(); i++)
		a[i] = 'a'+i;

	do	
	{
		string str2(a, a + str.length());
		if (str == str2)
		{
			cout << order; break;
		}
		order++;
	} while (next_permutation(a, a + str.length()));
}

在测试系统上总是出现“'NoneType' object has no attribute 'split'”

你可能感兴趣的:(蓝桥杯,蓝桥杯,算法,c++,数据结构)