洛谷P2822組合數問題

傳送門啦

15分暴力,但看題解說暴力分有30分。

就是找到公式,然后套公式。。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;long long read(){char ch;bool f = false;while((ch = getchar()) < '0' || ch > '9')if(ch == '-')  f = true;int res = ch - 48;while((ch = getchar()) >= '0' && ch <='9')res = res * 10 - ch + 48;return f ? res + 1 : res; 
}long long jc(long long a){//求階乘 if(a == 0)  return 1;long long ans = 1;for(int i=1;i<=a;i++)ans *= i;return ans; //b = !a 
} long long C(long long n,long long m){return jc(n) / (jc(m) * jc(n - m));
}
//組合數公式:Cn^m = !n / (!m * !(n - m)) long long t,k,n,m;
long long sum,x;int main(){t = read();  k = read();while(t--){x = 0;n = read();  m = read();//sum = jc(n) / (jc(m) * jc(n - m));for(long long i=1;i<=n;i++){//int j = min(i , m);for(long long j=1;j<=min(i,m);j++){//sum = jc(i) / (jc(j) * jc(i - j));if(C(i,j) % k == 0)x++;}}printf("%lld\n",x);}return 0;
}

組合數證明

15分,我現在用了組合數的遞推公式,按理說應該更快了,但。。(想不通,數據范圍在那里啊)

c[i][j]即為從i件物品中選j件的方案數。如果第i件物品不選,方案數就變為c[i-1][j],如果選第i件物品,方案數就變為c[i-1][j-1],總方案數就為兩種情況的方案數之和

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 2005;long long read(){char ch;bool f = false;while((ch = getchar()) < '0' || ch > '9')if(ch == '-')  f = true;int res = ch - 48;while((ch = getchar()) >= '0' && ch <='9')res = res * 10 - ch + 48;return f ? res + 1 : res; 
}long long t,k,n,m;
long long sum,x,C[maxn][maxn];int main(){t = read();  k = read();while(t--){x = 0;C[1][0] = C[1][1] = 1;n = read();  m = read();for(long long i=2;i<=n;i++){C[i][0] = 1;for(long long j=1;j<=min(i,m);j++){C[i][j] = C[i-1][j] + C[i-1][j-1];if(C[i][j] % k == 0)x++;}}printf("%lld\n",x);}return 0;
}

為了提高效率,我們可以進行進一步的優化,就是預處理出組合數從而求出所有區間的滿足條件的組合數個數,這里就要用到二維前綴和

楊輝三角

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 2005;inline int read() {int x=0,f=1;char ch=getchar();while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;
}long long t,k,n,m;
long long sum[maxn][maxn],x,C[maxn][maxn];void work(){for(int i=1;i<=2000;i++){C[i][0] = 1;C[i][i] = 1;}C[1][1] = 1;for(long long i=2;i<=2000;i++)for(long long j=1;j<i;j++){C[i][j] = (C[i-1][j] + C[i-1][j-1]) % k;}for(long long i=1;i<=2000;i++){for(long long j=1;j<=i;j++){sum[i][j] = sum[i-1][j] + sum[i][j-1] - sum[i-1][j-1];if(C[i][j] == 0)sum[i][j]++ ;}sum[i][i+1] = sum[i][i]; }
}int main(){memset(C,0,sizeof(C));memset(sum,0,sizeof(sum));t = read();  k = read();work();while(t--){n = read();  m = read();m = min(n , m);printf("%lld\n",sum[n][m]);}return 0;
}

還有一個事不得不說,我改了一下午竟然發現是自己的快讀打錯了:

修改后:

暴力 40分

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;inline int read() {int x=0,f=1;char ch=getchar();while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;
}long long jc(long long a){//求階乘 if(a == 0)  return 1;long long ans = 1;for(int i=1;i<=a;i++)ans *= i;return ans; //b = !a 
} long long C(long long n,long long m){return jc(n) / (jc(m) * jc(n - m));
}
//組合數公式:Cn^m = !n / (!m * !(n - m)) long long t,k,n,m;
long long sum,x;int main(){t = read();  k = read();while(t--){x = 0;n = read();  m = read();//sum = jc(n) / (jc(m) * jc(n - m));for(long long i=1;i<=n;i++){//int j = min(i , m);for(long long j=1;j<=min(i,m);j++){//sum = jc(i) / (jc(j) * jc(i - j));if(C(i,j) % k == 0)x++;}}printf("%lld\n",x);}return 0;
}

遞推公式 70

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 2005;inline int read() {int x=0,f=1;char ch=getchar();while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;
}long long t,k,n,m;
long long sum,x,C[maxn][maxn];int main(){t = read();  k = read();while(t--){x = 0;C[1][0] = C[1][1] = 1;n = read();  m = read();for(long long i=2;i<=n;i++){C[i][0] = 1;for(long long j=1;j<=min(i,m);j++){C[i][j] = C[i-1][j] + C[i-1][j-1];if(C[i][j] % k == 0)x++;}}printf("%lld\n",x);}return 0;
}

轉載于:https://www.cnblogs.com/Stephen-F/p/9884660.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/250341.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/250341.shtml
英文地址,請注明出處:http://en.pswp.cn/news/250341.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于Docker的GoldenGate部署

前言Docker最近幾年異常火爆&#xff0c;主要是因為其方便、快捷、輕量&#xff0c;相對于VM&#xff0c;它不需要占用太多資源&#xff0c;隨時可以創建、刪除&#xff0c;或在已有image上添加一些軟件&#xff0c;再制作成另一個模板image供日后使用。Docker提供的Hub或priva…

javascript --- 防抖與節流

說明 源碼 1. 防抖與節流 1.1 防抖 防抖: 觸發事件后,在n秒內函數只執行一次 記憶: 你手比較抖,不小心按了按鈕2下…你只希望它只執行一次.且按第二次結束時間算…這就用到了防抖技術 1.2 節流 節流: 連續發生的事件,在n秒內只執行一次函數 1.3 防抖與節流的區別 在一段…

bugku_本地包含

先上payload: 1、?hello);show_source(%27flag.php%27);// 2、?hello);include $_POST[zzz];// POST傳參:zzzphp://filter/readconvert.base64-encode/resourceflag.php 3、?hellofile(%27flag.php%27) 4、?helloshow_source(flag.php) 首先我們來看源碼&#xff1a; <?…

javascript --- js中的作用域 變量提升

1 求以下函數的輸出 1.1 考察點: 變量提升、this、作用域 // 考察點 作用域、this、變量提升 var a 10 function test() {a 100console.log(a) console.log(this.a) var aconsole.log(a) } test()第一個和第三個肯定是100在node環境下,沒有window的概念,因此輸出的是 und…

洛谷1091合唱隊形

題目描述 N位同學站成一排&#xff0c;音樂老師要請其中的(N?K)位同學出列&#xff0c;使得剩下的K位同學排成合唱隊形。 合唱隊形是指這樣的一種隊形&#xff1a;設K位同學從左到右依次編號為1,2,…,K&#xff0c;他們的身高分別為T1?,T2?,…,TK?&#xff0c; 則他們的身高…

poj3069 Saruman's Army(貪心)

https://vjudge.net/problem/POJ-3069 弄清楚一點&#xff0c;第一個stone的位置&#xff0c;考慮左右兩邊都要覆蓋R&#xff0c;所以一般情況下不會在左邊第一個&#xff08;除非前兩個相距>R&#xff09;。 一開始二層循環外層寫的i1&#xff0c;這樣對于數據諸如1 1 1>…

Redis的key和value大小限制

Redis的key和value大小限制今天研究了下將java bean序列化到redis中存儲起來&#xff0c;突然腦袋靈光一閃&#xff0c;對象大小會不會超過redis限制&#xff1f;不管怎么著&#xff0c;還是搞清楚一下比較好&#xff0c;所以就去問了下百度&#xff0c;果然沒多少人關心這個問…

jquery --- 監聽tab欄的變化

1. jQuery樣式操作 1.1 操作css方法 參數只寫屬性名,則返回屬性值(字符串) $(this).css(color)參數是 屬性名、屬性值(逗號分隔&#xff0c;則表示設置屬性 $(this).css(color,red)參數可以是對象的形式 $(this).css({width: 400px,height: 400px })1.2 設置類樣式方法 添…

bzoj 1645: [Usaco2007 Open]City Horizon 城市地平線【線段樹+hash】

bzoj題面什么鬼啊…… 題目大意&#xff1a;有一個初始值均為0的數列&#xff0c;n次操作&#xff0c;每次將數列(ai,bi-1)這個區間中的數與ci取max&#xff0c;問n次后元素和 離散化&#xff0c;然后建立線段樹&#xff0c;每次修改在區間上打max標記即可 #include<iostrea…

Redis單機和集群環境搭建

一、安裝單機版redis 1、可以自己去官網下載&#xff0c;當然也可以用課程提供的壓縮包 # yum install gcc # wget http://downloads.sourceforge.net/tcl/tcl8.6.1-src.tar.gz # tar -xzvf tcl8.6.1-src.tar.gz # cd /usr/local/tcl8.6.1/unix/ # ./configure # make &…

yum離線安裝

安裝yum-plugin-downloadonly插件 yum install -y yum-plugin-downloadonly下載對應的軟件包&#xff0c;我們以mysql為例&#xff0c;終端輸入如下命令 yum install -y --downloadonly --downloaddir/soft/mysql mysql --downloaddir用來指定下載的路徑轉載于:https://www.cnb…

算法 --- 遞歸實現多級樹展開結構

說明 先根據數據渲染,然后再實現事件 渲染 在項目中,經常會給出一個深度不確定的數組,數字結構如下: data [{name: a, child:[{name: a1},{name: a2, child: [{name:a21}]}]},{name: b} ]要求將數組渲染成對應的目錄結構, 結構如下: <ul><li>a<ul><…

PYTHON自動化Day4-交換變量,字符串方法,拷貝,集合,文件,文件指針

一.判斷 # 非空即真、非0即真 # 不為空的話就是true&#xff0c;是空的話就是false # 只要不是0就是true&#xff0c;是0就是false# 布爾類型 # True False name input(請輸入你的名字&#xff1a;).strip() a [] #false d{} # false c 0 #false f tuple() #false e #fa…

Ajax-jsonp

一、什么是Jsonp jsonp(json with padding) 是一種“使用模式”&#xff0c;可以讓網頁從別的域名那獲取資料&#xff0c;即跨域讀取數據。 為什么會使用jsonp呢&#xff1f;因為同源策略&#xff08;數據來源一致&#xff09;&#xff0c;現在所有支持javascript 的瀏覽器都會…

javascript --- [讀書筆記] 回流與重繪 前端優化小結

1. 瀏覽器渲染原理 請說出: 從用戶在瀏覽器地址輸入網址,到看整個頁面,中間都發生了哪些事情? HTTP請求階段HTTP響應階段瀏覽器渲染階段 1.1 可能用到的知識 1.1.1 進程 Process、線程 Thread、 棧內存 Stack 進程: 就是開的每一個程序: QQ、網易云音樂、Typora、VSCode……

ARP協議,以及ARP欺騙

1.定義&#xff1a; 地址解析協議&#xff0c;即ARP&#xff08;Address Resolution Protocol&#xff09;&#xff0c;是根據IP地址獲取物理地址的一個TCP/IP協議。主機發送信息時將包含目標IP地址的ARP請求廣播到網絡上的所有主機&#xff0c;并接收返回消息&#xff0c;以此…

css --- [小結]讓盒子水平垂直居中的解決方案

描述 有如下模型,想辦法讓 <style>.box{width: 500px;height: 500px;background: skyblue;} </style> <div class"box"><div class"inner"></div> </div>想辦法讓inner在box中水平垂直居中 方案1: 使用絕對定位 讓…

數組洗牌 Fisher Yates

看播放器代碼時發現的這個洗牌算法&#xff0c;再網上查了一番 作用是把數組變成隨機序列&#xff0c;原理類似于從牌堆A中隨機抽牌放進牌堆B 代碼1&#xff1a; 返回一個由&#xff08;數組下標&#xff09;組成的數組 function random(length) {function shuffle (arr) {for…

一個不錯的MYSQL數據庫備份類,PHP版,一個文件,精簡版

1 <?php2 class DbManage {3 var $db; // 數據庫連接4 var $database; // 所用數據庫5 var $sqldir; // 數據庫備份文件夾6 // 換行符7 private $ds "\n";8 // 存儲SQL的變量9 public $sqlContent "";10 // 每條sql…

javascript --- 堆棧內存與閉包的作用

你可能會用到的 堆內存: 存儲引用類型值所在的空間棧內存: 存儲基本類型值和存儲代碼所在空間函數上下文: JS每一個函數在執行的時候都會創建一個執行上下文 1. 堆內存中的數字和字符串都是相等的 let a {}, b0, c0; a[b] marron; a[c] Mar console.log(a[b]) // Mar第一…