有一个不超过 的正整数 n,知道这个数除以 2 至 49 后的余数如下表所示,求这个正整数最小是多少。
一元线性同余方程组问题最早可见于中国南北朝时期(公元5世纪)的数学著作《孙子算经》卷下第二十六题,叫做“物不知数”问题,原文如下:有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二。问物几何?即,一个整数除以三余二,除以五余三,除以七余二,求这个整数。
直接求解是不现实的,n的值范围虽然限制在10^17范围内,但依然很大,所以想办法把步长拉长。
中国剩余定理的解是 , 思路就是先求前面部分的模组的部分解,然后利用这个解,加大步长。
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;
}
}
已知今天是星期六,请问 天后是星期几?
注意用数字 1 到 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'”