继续过题:
置换群篇:
Old Sorting:问一个置换变为升序最少用几次,用到了置换群的一个结论,就是让一个含有cnt个元素的循环节要想变成升序最少需要cnt-1次,然后dfs搜循环节就行了。
费马小定理篇(一直都只是知道这个定理,也曾经用过,一看博客才发现并不是个不常用的定理,处处有优化啊):
Sum:费马小定理比较基础的应用,求2^n-1,由于n很大,结果又需要对1e9+7取余,因此想到用费马小定理,也就是2^(nmod(1e9+6))。这里代码中感觉对大数取余这块写的比较简,于是拓下来:
- int len = strlen(str);
- N = 0;
- for(int i = 0; i < len; i++)
- N = (N * 10 + str[i] - '0') % (MOD-1)
M斐波那契数列:一个特殊的斐波那契数列,F0=a,F1=b,Fn=Fn-1*Fn-2,经过推倒之后发现正好是Fn=a^fn-2*b^fn-1,这里f为正版斐波那契数列,这里要对1e9+7取余,由于n很大,因此需要用到矩阵快速幂,又因为结果很大,需要做指数,因此用到费马小定理,在矩阵快速幂的时候对1e9+6取余。
Remoteland:结论:最大的完全平方数A = n! / (res),其中res=[1, n]中所有指数为奇数的质数乘积。为何?因为指数为奇数的话乘一块就不能构成完全平方数了,然后就是快速求阶乘中指数的方法:
- int num(int n, int p)
- {
- int sum = 0;
- while(n)
- {
- sum += n / p;
- n /= p;
- }
- return sum;
- }
然后用到了费马小定理求逆元/res%mod=*res^(mod-2),这里mod和res要互质。
Turn the pokers:组合数加逆元,有点类似于省赛时候遇到的那个题目。