SDUT 2241-计算组合数C(n,m)(递推)

题目链接:点击打开链接

线性O(n) 计算组合数,递推法。

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <string>
#include <cctype>
#include <vector>
#include <cstdio>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#define maxn 1005
#define _ll __int64
#define ll long long
#define INF 0x3f3f3f3f
#define Mod 1<<40+10
#define pp pair<int,int>
#define ull unsigned long long
using namespace std;
ll C(ll n,ll m)
{
	if(m==0||n==m) return 1;
	ll sb=min(m,n-m);
	ll f=1,f1;
	for(ll i=1;i<=sb;i++)
	{
		f1=f*(n-i+1)/(i);
		f=f1;
	}
	return f1;
}
int main()
{
	int T;ll n,m;
	scanf("%d",&T);
	while(T--)
	{
		scanf("%lld%lld",&n,&m);
		printf("%d\n",C(n,m));
	}
	return 0;
}
时间: 2024-10-23 21:20:38

SDUT 2241-计算组合数C(n,m)(递推)的相关文章

hdu 1466 计算直线的交点数 递推

以前做这道题目的时候,花了好长时间找规律,感觉十分高大上,今天回顾这个题目的时候,突然有了顿悟, 有了递推的思想就容易解决了. 题意:给你n条直线,问:输出这些直线所有相交情况下的交点个数(升序输出) 解题思路:我们可以从n-1条直线相交的情况推导出n条直线的相交情况,考虑到直线的关系不是相交就是平行,我们可以推倒一下n=4的情况: 已知n=3时有0,2,3; (1):第四条直线与前三条平行,则有0; (2):第四条直线与其中两条平行,则有3; (3):第四条直线与其中一条平行,则有4,5; (

51nod1149 Pi的递推式

基准时间限制:1 秒 空间限制:131072 KB 分值: 640 F(x) = 1 (0 <= x < 4) F(x) = F(x - 1) + F(x - pi) (4 <= x) Pi = 3.1415926535..... 现在给出一个N,求F(N).由于结果巨大,只输出Mod 10^9 + 7的结果即可. Input 输入一个整数N(1 <= N <= 10^6) Output 输出F(N) Mod 10^9 + 7 Input示例 5 Output示例 3 数学问

【Java】课后动手动脑及递归递推的应用

1.代码 表示方法为静态方法,在其它类中可以直接通过类名去调用这个方法! 例如public static void main(String[] args){ClassName.prt("abc");}如果不加static,则只有通过该类的对象去调用.例如public static void main(String[] args){ClassName name=new ClassName();name.prt("abc");} 2.线性同余纯随机数生成器 3.代码 4

递推问题之马踏过河卒问题

problem 棋盘上A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下.或者向右.同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点.因此称之为"马拦过河卒". 棋盘用坐标表示,A点(0, 0).B点(n, m)(n, m为不超过15的整数),同样马的位置坐标是需要给出的.现在要求你计算出卒从A点能够到达B点的路径的条数,假设马的位置是固定不动的,并不是卒走一步马走一步. 输入描述 Input Description 一行四个数据,分别表示B

POJ-1163-The Triangle: DP入门 递归 递推

递归思路 超时算法 #include<iostream> using namespace std; #define Size 101 int Triangle[Size][Size]; int n; int GetAns( int i, int j ) { if( i==n ) return Triangle[i][j]; int x=GetAns( i+1, j ); int y=GetAns( i+1, j+1 ); return max(x, y)+Triangle[i][j]; } i

算法分析基础——差消法求解高阶递推方程

差消法,简单来讲,就是对高阶的递推方程作差,转化为一阶方程后再运用迭代法.有了迭代法的基础后,差消法理解起来就很容易了.这里举出对快速排序的分析加以说明. 对于快排,我们知道选择不同的轴值,会导致不同的算法效率.最坏的情况下,选取的轴值恰好是待排序数组的最值,那么排序的效率就会退化为线性时间.现在我们来估算平均情况下快速排序的时间复杂度. 设T(n)为待排序数组长度为n时,快速排序算法需要的比较次数.那么T(1) = 0,而T(n)的递推方程相对于轴值的选取有如下n种情况: T(n) = T(0

lucas定理计算组合数

lucas定理计算组合数 C(n,k)有多种解法,1,dp递推:2,直接计算:3,lucas定理 lucas定理适合组合数取余数的计算,n和k的范围可到10^18 1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<cstring> 5 #include<algorithm> 6 7 using namespace std; 8 9 const int ma

【UVA】12034-Race(递推,组合数打表)

递推公式,假设第一名有i个人并列,那么: f[n] = C(n,i) * f[n - i]; 打出1 ~ 1000的所有组合数,之后记忆化搜索,需要打表. 14026995 12034 Race Accepted C++ 0.032 2014-08-12 11:47:47 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<vector&g

[sdut]2879计数dp……或者递推

第五届省赛C:colourful cupcakes N=60. 天真如我,居然在考虑搜索的算法/(ㄒoㄒ)/~~三叉树……3^60=10^24+……不计算考虑复杂度都是耍流氓>_< 再算了一下,感觉O(N^4)可以试试,60^4=10^8+……但是毕竟最差的情况嘛>_<,再看一下题解果然是4重循环的……计数……dp……(想到之前坚信的搜索不禁(*/ω\*)) 中间看到了一个三次动规六个方程的算法. 做麻烦了. 学长思路好快. #include<iostream> #in