bzoj4870&luogu3746 [六省聯考2017]組合數問題
題目的大意就是要求我們從n*k個數字中選擇%k餘r的方案數
定義f(i,j)=∑∞t=0Cj+tki
f(i,j)=f(i−1,j)+f(i−1,(j−1) mod k)
這道題我們轉移是用狀態轉移因為每次都是前一個i-1轉移過來的
不妨設當前狀態
1 2 3 4 5 6
a b c d e f
那麼我們開一個矩陣可以知道
1 2 3 4 5 6
1 1 1
2 1 1
3 1 1
4 1 1
5 1 1
6 1 1
我一開始初值給錯了,應該給0~k-1中每個ii都給1
因為我們知道這相當於給取i個為1留了一種可能
#include<cstdio>
#include<cstring>
#define N 55
struct matrix{
int f[N][N],l,c;
}ans,m;
int n,p,k,r;
inline matrix multiply(matrix a,matrix b){
matrix c;memset(c.f,0,sizeof(c.f));
c.l=a.l;c.c=b.c;
for (int i=0;i<a.l;++i)
for (int j=0;j<b.c;++j)
for (int z=0;z<a.c;++z){
c.f[i][j]=((long long) a.f[i][z]*b.f[z][j]%p+c.f[i][j])%p;
}
return c;
}
int main(){
freopen("3746.in","r",stdin);
scanf("%d%d%d%d",&n,&p,&k,&r);long long t=(long long)n*k;
m.c=m.l=k;
for (int i=0;i<k;++i) m.f[i][i]++,m.f[(i-1+k)%k][i]++;
ans.c=k;ans.l=k;
for (int i=0;i<k;++i) ans.f[i][i]=1;
for (;t;t>>=1,m=multiply(m,m)){
if (t&1) ans=multiply(m,ans);
}
printf("%d",ans.f[0][r]);
return 0;
}
相關推薦
bzoj4870&luogu3746 [六省聯考2017]組合數問題
題目的大意就是要求我們從n*k個數字中選擇%k餘r的方案數 定義f(i,j)=∑∞t=0Cj+tki f(i,j)=f(i−1,j)+f(i−1,(j−1) mod k) 這道題我們轉移是用狀態轉移因為每次都是前一個i-1轉移過來的 不妨設當前狀
六省聯考2017 組合數問題
矩陣快速冪 問題 div set 合數 node href urn turn 題鏈 SOL: 可以把原題看做在n*k個數裏選p個數且p%k=r, 有DP f[i][j]=f[i-1][j]+f[i-1][j-1] 矩陣快速冪加速轉移即可。 #include<
P3746 [六省聯考2017]組合數問題
P3746 [六省聯考2017]組合數問題 \(dp_{i,j}\)表示前\(i\)個物品,取的物品模\(k\)等於\(r\),則\(dp_{i,j}=dp_{i-1,(j-1+k)%k}+dp_{i-1,j}\) \(dp_{i,0},dp_{i,1},dp_{i,2}.....dp_{i,k-1}\)
【[六省聯考2017]組合數問題】
好水啊 但是我傻啊 我們設\(dp[i][j]=\sum_{t=0}^{∞}\binom{ik}{j+tk}\) 根據組合數萬年不變的遞推式\(\binom{n}{m}=\binom{n-1}{m-1}+\binom{n-1}{m}\) 我們有\(dp[i][j]=dp[i-1][j]+dp[i-1]
洛谷3746 [六省聯考2017]組合數問題
標籤:組合數,矩陣快速冪,倍增 題目 題目傳送門 題目描述 組合數 C(n,m) 表示的是從 n 個互不相同的物品中選出 m 個物品的方案數。舉個例子,從 (1;2;3) 三個物品中選擇兩個物品可以有 (1;2);(1;3);(2;3) 這三種選擇
【BZOJ 4870】【2017六省聯考】組合數問題
其實我剛看到題目跟大部分人的反應是一樣的,暴力Lucas定理。。。 後來發現沒說模數一定是質數,那沒事還是能騙好多分的。 然而事實上是那些暴力分根本用不到Lucas定理。。。 正解: 所求式子的
[六省聯考2017]相逢是問候
多少 i++ ans 問題 不用 .... int out content 相逢是問候 2017-09-09 Description Informatikverbindetdichundmich. 信息將你我連結。B君希望以維護一個長度為n的數組,這個數組的下標為從1到
[六省聯考2017]分手是祝願
return inline c++ www. bits 有關 const fin def 題面在這裏 題意 有n盞燈,當前狀態為亮或者不亮,當改變第x盞燈的開關狀態時(由亮變暗,由暗變亮),為x約數編號的燈也會改變開關狀態 B先生先隨機操作,當存在一種能使用小於k的操作次數
六省聯考2017 期末考試
++ hsb += esp mes signed scan fine href 題鏈 SOL:我們枚舉最晚的一門學科在什麽時候出成績,統計答案即可。 我們考慮兩種方法,搞一搞就好了。 #include<bits/stdc++.h> #define N
[六省聯考2017]壽司餐廳
pty urn pos www. pen all for || space 題鏈 這道題長著網絡流的數據範圍。 最大權閉合子圖問題 跑最小割 #include<bits/stdc++.h> #define eho(x) for(int& i
六省聯考2017 Day1
bool IT uil body res == read putchar HR 2018.3.18 Test 時間:3.5h 得分:太zz不寫了(T3 60暴力分就我沒看。。) T1 BZOJ.4868.[六省聯考2017]期末考試 題目鏈接 /* 所有人都只與最大的bi有
洛谷 P3750 [六省聯考2017]分手是祝願
splay pen log pro names ios include for lap 傳送門 題解 //Achen #include<algorithm> #include<iostream> #include<cstring> #
洛谷P3747 [六省聯考2017]相逢是問候
solution AC print int geo typename uil color tps 傳送門 題解 擴展歐拉定理。 線段樹維護,已經全改到底了的節點就不管,不然暴力修改下去。 //Achen #include<algorithm> #includ
洛谷P3745 [六省聯考2017]期末考試
close tin cto ide include efi vector play mil 傳送門 題解 //Achen #include<algorithm> #include<iostream> #include<cstring>
洛谷P3749 [六省聯考2017]壽司餐廳
傳送門 分享圖片 pro name 直接 ostream AR sed splay 傳送門 題解 這幾道都是上周llj講的題,題解也寫得十分好了,所以直接貼了幾個鏈接和代碼。 //Achen #include<algorithm> #include<i
[BZOJ4868][六省聯考2017]期末考試(三分)
min -s www. def 聽說 const 調整 n) res 4868: [Shoi2017]期末考試 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 964 Solved: 439[Submit][Statu
[BZOJ4873][六省聯考2017]壽司餐廳(最大權閉合子圖)
矩陣 size problem fin rep min 現在 相互 情況 4873: [Shoi2017]壽司餐廳 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 490 Solved: 350[Submit][Sta
P3750 [六省聯考2017]分手是祝願(期望+DP)
nbsp name space 現在 處理 math ans tor getc 題解 很容易想出來最優策略是什麽。 就是從n到1看到開著的燈就把它關了 我們預處理出當前狀態把燈全部關閉後的最少步數cnt 然後我們的主人公就要瞎按。。。 設dp[i]代表當前狀態最優解為
BZOJ4869 六省聯考2017相逢是問候(線段樹+尤拉函式)
由擴充套件尤拉定理,a^(a^(a^(……^x)))%p中x作為指數的模數應該是φ(φ(φ(φ(……p)))),而p取log次φ就會變為1,也即每個位置一旦被修改一定次數後就會變為定值。線段樹維護區間剩餘修改次數的最大值,暴力修改即可。 可以預處理出每個位置進行k次操作後的值。直接計算是log^3的
P3749 [六省聯考2017]壽司餐廳 最小割
\(\color{#0066ff}{ 題目描述 }\) Kiana 最近喜歡到一家非常美味的壽司餐廳用餐。 每天晚上,這家餐廳都會按順序提供 \(n\) 種壽司,第 \(i\) 種壽司有一個代號 \(a_i\) 和美味度 \(d_{i, i}\) ,不同種類的壽司有可能使用相同的代號。每種壽司的份數都是無