acm-复杂度
来源:互联网 发布:java设置字符集编码 编辑:程序博客网 时间:2024/05/22 12:39
求逆元
首先给出这个Lucas定理:
A、B是非负整数,p是质数。AB写成p进制:A=a[n]a[n-1]...a[0],B=b[n]b[n-1]...b[0]。
则组合数C(A,B)与C(a[n],b[n])*C(a[n-1],b[n-1])*...*C(a[0],b[0])
即:Lucas(n,m,p)=c(n%p,m%p)*Lucas(n/p,m/p,p)
以求解n! %p为例,把n分段,每p个一段,每一段求的结果是一样的。但是需要单独处理每一段的末尾p, 2p,...,把p提取出来,会发现剩下的数正好又是(n /p)!,相当于划归成了一个子问题,这样递归求解即可。
这个是单独处理n!的情况,当然C(n,m)就是n!/(m!*(n-m)!),每一个阶乘都用上面的方法处理的话,就是Lucas定理了,注意这儿的p是素数是有必要的。
Lucas最大的数据处理能力是p在10^5左右,不能再大了,hdu3037就是10^5级别的!
对于大组合数取模,n,m不大于10^5的话,用逆元的方法,可以解决。对于n,m大于10^5的话,那么要求p<10^5,这样就是Lucas定理了,将n,m转化到10^5以内解。
然后再大的数据,我就不会了!
复杂度
- 描述
for(i=1;i<=n;i++)
for(j=i+1;j<=n;j++) for(k=j+1;k<=n;k++) operation; 你知道 operation 共执行了多少次吗;
- 输入
- 输入 m 和n 表示m为for循环的层数,n为for中的n。
(n,m<=2000),输入以n==0和m==0结束 - 输出
- 输出operation执行的次数(输入结果mod 1009)
- 样例输入
2 31 32 40 0
- 样例输出
336
- 上传者
- changhongli
我的代码:(没有ac,想复杂了,坑啊)
#include
using namespace std;
#define mod 1009
int Multi[1010];
void init()
{
}
int mod_inverse(int s,int t,int n)
{
}
int Lucas(int m,int n)
{
}
int main()
{
}
ac的代码:(网上的,记录一下)
解题思路:
这是我队友chl出的一道题目,刚开始认为是找规律问题,然后就开始考虑找规律,昨天晚上找到一个自认为非常完美的规律,结果今天早上来发现是错的,后来经他提醒终于知道了,这一题需要用到组合数学的知识。。
首先m层,每层都有一个值i、j、k….我们发现这m个值是不重复的,而且是递增序列,于是我们可以想到只需要计算总共有多少中m个数的组合的情况即可,即C(m,n)
但是问题又来了,n和m的值最大为2000,因此求C(m,n) 的时候long long 也存不下,而且(n%mod)/(m%mod)!= (n/m)%mod;
这就又需要用到另外的一个公式
C(m,n)= C (m,n-1) + C (m-1,n-1);
根据递推公式打表完美解决
#include
#include
using namespace std;
#define N 1009
int res[2001][2001]={0};
void f()
{
}
int main()
{
}
- acm-复杂度
- 【算法-ACM-素数】求素数的算法及其复杂度分析
- 关于ACM算法复杂度及算法运算次算
- ACM算法-时间复杂度分析(1.渐进分析)
- ACM算法-时间复杂度分析(3.渐进符号)
- ACM算法-时间复杂度分析(6.相关练习exercise)
- ACM算法-时间复杂度分析(2.最坏,平均,最好时间复杂度分析)
- ACM算法-时间复杂度分析(4.有关时间复杂度循环的分析)
- ACM算法-时间复杂度分析(5.有关时间复杂度递归的分析)
- 复杂度
- 复杂度
- 复杂度
- 复杂度
- 复杂度
- 复杂度
- 复杂度
- POJ3636 Nested Dolls ACM解题报告(暴力贪心(也可用二分查找降低复杂度))
- ACM
- 高次方求模
- 求a的b次方、a的b次方对m取模
- acm-次方求模
- acm-我排第几个
- 体验有默认参数的函数————求圆的面积和圆柱的体积
- acm-复杂度
- acm-奇数阶魔方
- acm-A*B Problem
- acm-Fibonacci数列(四)
- Oracle向PostgreSQL移植实例
- acm-光棍节的快乐
- Loadrunner如何选择协议(转)
- acm-p次方求和
- acm-Biorhythms