1. 程式人生 > >[HDU](5698)瞬間移動 ---- 組合數學(組合數)

[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