2018年2月28日训练日记

本文介绍了算法竞赛中几个重要的知识点,包括置换群理论在排序问题中的应用、费马小定理及其在大数运算中的优化作用、特殊斐波那契数列的矩阵快速幂计算方法等。此外还讨论了如何通过阶乘来寻找最大完全平方数,以及组合数和逆元在实际问题中的运用。

  继续过题:

  置换群篇:

  Old Sorting:问一个置换变为升序最少用几次,用到了置换群的一个结论,就是让一个含有cnt个元素的循环节要想变成升序最少需要cnt-1次,然后dfs搜循环节就行了。

  费马小定理篇(一直都只是知道这个定理,也曾经用过,一看博客才发现并不是个不常用的定理,处处有优化啊):

  Sum:费马小定理比较基础的应用,求2^n-1,由于n很大,结果又需要对1e9+7取余,因此想到用费马小定理,也就是2^(nmod(1e9+6))。这里代码中感觉对大数取余这块写的比较简,于是拓下来:

  

  1.         int len = strlen(str);  
  2.         N = 0;  
  3.         for(int i = 0; i < len; i++)  
  4.             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]中所有指数为奇数的质数乘积。为何?因为指数为奇数的话乘一块就不能构成完全平方数了,然后就是快速求阶乘中指数的方法:

  1. int num(int n, int p)  
  2. {  
  3.     int sum = 0;  
  4.     while(n)  
  5.     {  
  6.         sum += n / p;  
  7.         n /= p;  
  8.     }  
  9.     return sum;  

  然后用到了费马小定理求逆元/res%mod=*res^(mod-2),这里mod和res要互质。

  Turn the pokers:组合数加逆元,有点类似于省赛时候遇到的那个题目。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值