在看题解时,我们经常会看到这样一句话:大家应该都知道……,众所周知……,但对于我这种蒟蒻,大佬眼们中的常识,到我这里仿佛比高级算法还难,大多都是听都没听过。
所以,本蒟蒻决定总结一下那些鲜为人知的"常识",让自己不断变强。
持续更新
1.两个数的积=它们的最大公约数和最小公倍数的积。
2.一个序列最少可以用多少个下降子序列拼出来=这个序列最长上升子序列的长度
3.八数码问题中如果逆序对的数量是奇数,那么一定无解。所有的奇数码问题中,如果逆序对的数量时奇数,那么一定无解。
4.偶数码问题中,如果空格到当前目标行(大部分情况下时最后一行)的距离+逆序对数量为奇数,那么一定无解。
5.总结3.4.两点,在N数码问题中: 当N为奇数时,逆序对数量奇偶性相同的两个状态可以互相到达;当N为偶数时,逆序对数量+空格到目标行距离相等的两个状态可以互相到达。
6.斐波那契数列前N项的平方和=f[n]*f[n+1]我不会证明,贴一下大佬的博客
7.lg[i]=lg[i-1]+(1<<lg[i-1]==i);
8.偶数位的回文数除了11都不是质数(显然,因为可以被11整除)
9.波兰特-切比雪夫定理:若整数n > 3,则至少存在一个质数p,符合n < p < 2n − 2。另一个稍弱说法是:对于所有大于1的整数n,至少存在一个质数p,符合n < p < 2n。一道例题:lgP5525小道消息
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<string>
#include<cstring>
using namespace std;
typedef long long ll;
ll n;
ll k;
bool is_prime(long long x){
if (x==1)
return false;
if (x==2) return true;
for (long long i=2;i*i<=x;i++){
if (x%i==0) return false;
}
return true;
}
int main(){
scanf("%lld%lld",&n,&k);
if (is_prime(k+1)&&k*2>=n) putchar('1');
//这里一定要写成k*2>=n的形式,而不能写成k>=n/2的形式(如果n是奇数会有下取整问题)
else putchar('2');
return 0;
}