[HDU](5698)瞬間移動 ---- 組合數學(組合數)
有一個無限大的矩形,初始時你在左上角(即第一行第一列),每次你都可以選擇一個右下方格子,並瞬移過去(如從下圖中的紅色格子能直接瞬移到藍色格子),求到第n行第m列的格子有幾種方案,答案對1000000007取模。
Input
多組測試資料。
兩個整數n,m(2≤n,m≤100000)
Output
一個整數表示答案
Sample Input
4 5
Sample Output
10
分析: 題意很容易搞懂,重點是怎麼把規律找出來
首先自己寫4組資料
n m ans
5 2 1
5 3 4
5 4 10
5 5 20
然後楊輝三角打表
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
我們發現規律就是求組合數C(n+m-4,m-2)
然後資料範圍1e5,O(n^2)肯定過不了,所以O(n)演算法求組合數
注意: 1e5交上去會RE,最好陣列開大一點
AC程式碼:
#include<iostream>
#include<cstdio>
using namespace std;
#define rep(i,s,e) for(int i=s;i<=e;i++)
#define rev(i,s,e) for(int i=e;i>=s;i--)
#define all(x) x.begin(),x.end()
#define sz(x) x.size()
#define szz(x) int(x.size()-1)
const int INF = 0x3f3f3f3f;
const int MOD = 1e9+7;
const int MAXN = 2e5+10;
typedef long long LL;
typedef pair<LL,LL> PII;
LL fat[MAXN];
void exgcd(LL a,LL b,LL &x,LL &y,LL &d)
{
if(!b) d=a,x=1,y=0;
else exgcd(b,a%b,y,x,d),y-=(a/b)*x;
}
LL inv(LL a,LL p)
{
LL x,y,d;
exgcd(a,p,x,y,d);
return d==1?(x%p+p)%p:-1;
}
void cal()
{
fat[0] = fat[1] = 1;
for(LL i = 2;i<MAXN;i++)
fat[i] = (fat[i-1]*i)%MOD;
}
LL c(LL n,LL m)
{
return fat[n]*inv(fat[m],MOD)%MOD*inv(fat[n-m],MOD)%MOD;
}
int main()
{
#ifdef LOCAL
freopen("in.txt","r",stdin);
#endif // LOCAL
ios_base::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
LL n,m;
cal();
while(cin>>n>>m)
{
cout<<c(n+m-4,m-2)<<endl;
}
return 0;
}
相關推薦
[HDU](5698)瞬間移動 ---- 組合數學(組合數)
有一個無限大的矩形,初始時你在左上角(即第一行第一列),每次你都可以選擇一個右下方格子,並瞬移過去(如從下圖中的紅色格子能直接瞬移到藍色格子),求到第n行第m列的格子有幾種方案,答案對1000000007取模。 Input 多組測試資料。 兩個
HDU 5698 瞬間移動 [數論] [逆元] [組合數取模]
瞬間移動 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 893 Accepted Sub
HDU 5698-瞬間移動
第一點。試著推一下會發現他是楊輝三角, 0 0 0 0 0 0 1 1 1 1 0 1 2 3 4 0 1 3 6 10 0 1 4 10 20(二項式係數)找規律。 或者首先我們分析一下這個題其實就是我們要從(1,1)點走到(n, m)點,而且只能走右下方
HDU 5698 瞬間移動(費馬、逆元)
題目:有一個無限大的矩形,初始時你在左上角(即第一行第一列),每次你都可以選擇一個右下方格子,並瞬移過去(如從下圖中的紅色格子能直接瞬移到藍色格子),求到第nn行第mm列的格子有幾種方案,答案對1000
HDU 4704 Sum(隔板原理+組合數求和公式+費馬小定理+快速冪)
ace php 模板 erl char printf 證明 style ron 題目傳送:http://acm.hdu.edu.cn/showproblem.php?pid=4704 Problem Description Sample Input 2 Sam
HDU 6114 Chess【逆元+組合數】(組合數模板題)
模板題 tro 正整數 現在 ros 沒有 algo clas tdi <題目鏈接> 題目大意: 車是中國象棋中的一種棋子,它能攻擊同一行或同一列中沒有其他棋子阻隔的棋子。一天,小度在棋盤上擺起了許多車……他想知道,在一共N×M個點的矩形棋盤中擺最多個數的車使其
The King’s Ups and Downs(HDU 4489,動態規劃遞推,組合數,國王的遊戲)
題意: 給一個數字n,讓1到n的所有數都以波浪形排序,即任意兩個相鄰的數都是一高一低或者一低一高 比如:1324 4231,再比如4213就是錯的,因為4高,2低,接下來1就應該比2高,但是它沒有 點選開啟題目連結 接下來思
CodeChef - ZUBRIDER Club of Riders 數學 組合數
At a shopping mall, every now and then, a naughty kid steals some chocolates from different chocolate shops and runs away. The guards in the shopping
FOJ 2020 組合(組合數取素數摸模板:Lucas)
Problem 2020 組合 Accept: 776 Submit: 1849 Time Limit: 1000 mSec Memory Limit : 32768 KB Problem Description 給出組合數C(n,m), 表示
【HDU 3037】Saving Beans(組合數取模)
Saving Beans Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3706 Acc
【HDU 5698】瞬間移動(組合數,逆元)
x和y分開考慮,在(1,1)到(n,m)之間可以選擇走i步。就需要選i步對應的行C(n-2,i)及i步對應的列C(m-2,i)。相乘起來。 假設$m\leq n$$$\sum_{i=1}^{m-2} C_{n-2}^i\cdot C_{m-2}^i=\sum_{i=1}^{m-2} C_{n-2}^i\cd
HDU 5698:瞬間移動(排列組合)
AC程式碼: #include <iostream> #include <stdio.h> #include <algorithm> using namespace std; typedef long long LL;
百度之星 初賽2 瞬間轉移 HDU 5698 (組合數+逆元)
大意:有一個無限大的矩形,初始時你在左上角(即第一行第一列),每次你都可以選擇一個右下方格子,並瞬移過去(如從下圖中的紅色格子能直接瞬移到藍色格子),求到第n行第m列的格子有幾種方案,答案對10000
【POJ - 1942 】Paths on a Grid (組合數學,求組合數的無數種方法)
題幹: Imagine you are attending your math lesson at school. Once again, you are bored because your teacher tells things that you already mastered ye
hdu 5698 求組合數(逆元+階乘 遞推公式
分析向格子裡填數發現,是左斜的楊輝三角,發現規律,其實就是求C(n+m-4,m-2)的組合數 求組合數用逆元+階乘(遞推) #include <iostream> #include <cstdio> #define ll long long
Paths on a Grid POJ - 1942 組合數學 (組合數的快速計算)
題意:格路問題 沒什麼難度 難點在於如何快速計算相對較大的組合數 思路:運用手寫計算組合數的方式進行計算 如c(8,3) 如果手算就是 8*7*6/(3*2*1)這樣可以很快得解出 計算程式碼為:(精度沒問題? 反正能過) 1 u c(u n,u m){ 2
DP?(數論+組合數學綜合題:組合數性質+預處理+組合數取摸)
Figure 1 shows the Yang Hui Triangle. We number the row from top to bottom 0,1,2,…and the column from left to right 0,1,2,….If using C(n,k) represents t
[hdu5698]: 瞬間移動(兩種方法求組合數)
瞬間移動 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Subm
hdu 5698 組合數
瞬間移動 Problem Description 有一個無限大的矩形,初始時你在左上角(即第一行第一列),每次你都可以選擇一個右下方格子,並瞬移過去(如從下圖中的紅色格子能直接瞬移到藍色格子),求到第nn行第mm列的格子有幾種方案,答案對1000000007100
hdu5698 組合數學(求組合數)
這題真的是有點煩人。 首先可以想到相當於是在左上角區域內選0到min(m-2,n-2)個點,然後求和。 (假設m<=n)也就是∑i=0m−2∁im−2∁in−2∑i=0m−2∁m−2i