1. 程式人生 > >[Codeforces 232B] Table (計數 + 揹包DP)

[Codeforces 232B] Table (計數 + 揹包DP)

Codeforces - 232B

給定一個 N×M的棋盤,每個格子都可以放一個棋子
問有多少種方案,使得每個 N×N的區域都恰好有 K 個棋子
其中 N100,NM1018,K<=N2

由樣例很容易看出,每列的棋子具有周期性
即第 x 列棋子的個數等於第 x+N 列棋子的個數
進一步整個棋盤可以被分為兩部分
M%N列為一類,後 NM%N為一類,各自的重複次數相同
然後可以用一個揹包DP來計算
dp[i][k]表示第 i 列,總共用了 k 個棋子,對答案的貢獻
再對每列列舉一個此列棋子的數目 j
dp[i][k]+=dp[i1][kj]

×CjNcnt
其中 cnt 是此類在棋盤上的週期個數,要提前預處理一下這個冪
總的複雜度為 (N2log(M/N)+N2K)
然後再列舉左邊那類中的棋子個數,累加得到最後的答案

#pragma comment(linker, "/STACK:102400000,102400000")
#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cctype>
#include <map> #include <set> #include <queue> #include <bitset> #include <string> #include <complex> using namespace std; typedef pair<int,int> Pii; typedef long long LL; typedef unsigned long long ULL; typedef double DBL; typedef long double LDBL; #define MST(a,b) memset(a,b,sizeof(a))
#define CLR(a) MST(a,0) #define SQR(a) ((a)*(a)) #define PCUT puts("\n----------") const int maxn=100+10, MOD=1e9+7; int N,K; LL M; int siz[2]; LL cnt[2]; int dp[2][maxn][maxn*maxn]; int C[maxn][maxn]; void DP(int); int Pow(LL,LL,int); int main() { #ifdef LOCAL freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); #endif while(~scanf("%d%lld%d", &N, &M, &K)) { siz[0] = M%N, siz[1] = N-M%N; cnt[0] = M/N+1, cnt[1] = M/N; DP(0); DP(1); int ans=0; for(int i=0; i<=K; i++) ans = (ans + (LL)dp[0][siz[0]][i]*dp[1][siz[1]][K-i])%MOD; printf("%d\n", ans); } return 0; } void DP(int id) { for(int i=0; i<=N; i++) { C[i][0]=1; for(int j=1; j<=i; j++) { C[i][j] = (C[i-1][j] + C[i-1][j-1]) %MOD; } } for(int i=0; i<=N; i++) for(int j=1; j<=i; j++) { C[i][j] = Pow(C[i][j], cnt[id], MOD); } CLR(dp[id]); // printf("id:%d\n", id); dp[id][0][0] = 1; for(int i=1; i<=siz[id]; i++) { for(int k=K; k>=0; k--) { for(int j=0; j<=N && j<=k; j++) { dp[id][i][k]= (dp[id][i][k] + (LL)dp[id][i-1][k-j]*C[N][j])%MOD; } // printf("i:%d k:%d dp:%d\n", i, k, dp[id][i][k]); } } } int Pow(LL x, LL n, int p) { LL res=1; while(n) { if(n&1) res=res*x%p; x=x*x%p; n>>=1; } return res; }

相關推薦

[Codeforces 232B] Table 計數 + 揹包DP

Codeforces - 232B 給定一個 N×M的棋盤,每個格子都可以放一個棋子 問有多少種方案,使得每個 N×N的區域都恰好有 K 個棋子 其中 N≤100,N≤M≤1018,K<=N2 由樣例很容易看出,每列的棋子具有周

Codeforces」758D貪心細節/dp

const i++ style n) using mean ++ break 情況 題意:原題在這 Alexander is learning how to convert numbers from the decimal system to any other,

Codeforces 126B. PasswordKMP,DP

Codeforces 126B. Password 題意:一個字串,找出最長的子串t,它既是字首又是字尾,還出現在中間。輸出t,不存在則輸出Just a legend。 思路:利用KMP演算法處理出next陣列,由next陣列的意義可以知道i為尾的最長相同字首字尾。則ne[n-1],ne[ne[n-1]],

HDU-2602-Bone Collector01揹包+dp

Many years ago , in Teddy’s hometown there was a man who was called “Bone Collector”. This man like to collect varies of bones , such as dog’s , cow’s

bzoj1079 [SCOI2008]著色方案計數DP

題目 有n個木塊排成一行,從左到右依次編號為1~n。你有k種顏色的油漆,其中第i種顏色的油漆足夠塗ci個木塊。 所有油漆剛好足夠塗滿所有木塊,即c1+c2+...+ck=n。相鄰兩個木塊塗相同色顯得很

度度熊與邪惡大魔王完全揹包dp

度度熊為了拯救可愛的公主,於是與邪惡大魔王戰鬥起來。 邪惡大魔王的麾下有n個怪獸,每個怪獸有a[i]的生命值,以及b[i]的防禦力。 度度熊一共擁有m種攻擊方式,第i種攻擊方式,需要消耗k[i]的晶石,造成p[i]點傷害。 當然,如果度度熊使用第i個技能打在第j個怪獸上面的話,會使得第j個怪獸的生命值減少p

Educational Codeforces Round 39-D-Timetable揹包DP

題意:給你n天,每天有m節課,你最多可以逃k節課,並且對於某一天,在你決定上的第一節課和最後一節課之間就算沒課,也要待在學校,問你可以在學校呆的最少時間是多少? 題解:對於每天,我們暴力出上x節課需

Codeforces 576D Flights for Regular Customers矩陣加速DP

升序 str reg regular ++i http flight return 排序 題目鏈接 Flights for Regular Customers 首先按照d的大小升序排序 然後分成m個時刻,每條路徑一次處理過來。 can[i][j]表示當前時刻i能否走

CodeForces - 613D:Kingdom and its Cities虛樹+DP

for pro void 染色 however == force don tac Meanwhile, the kingdom of K is getting ready for the marriage of the King‘s daughter. However

Codeforces】CF 8 C Looking for Order狀壓dp

輸出 max blank ret ces clas pan force date 題目 傳送門:QWQ 分析 這種題不會做 吃棗藥丸。。。。。 想到狀壓已經經過的點。 然後更新時枚舉兩個點加進去。 復雜度$ {O(2^n \times n^2)

【題解】洛谷P1941 [NOIP2014TG] 飛揚的小鳥揹包DP

次元傳送門:洛谷P1941 思路 從題意可知 在每個單位時間內 可以無限地向上飛 但是隻能向下掉一次 所以我們可以考慮運用揹包解決這道題 上升時 用完全揹包 下降時 用01揹包 設f[x][y]為在座標(x,y)時的最小點選螢幕次數 當飛到天花板時和撞到柱子時特判 一開始設ans為極大值 如

Codeforces 999F Cards and Joy二維DP

++i 代碼 鏈接 als 個人 href rds a+b min 題目鏈接:http://codeforces.com/problemset/problem/999/F 題目大意:有n個人,n*k張卡牌,每個人會發到k張卡牌,每個人都有一種喜歡的卡牌f[i],當一個人擁

金明的預算方案揹包DP

題目: 金明今天很開心,家裡購置的新房就要領鑰匙了,新房裡有一間金明自己專用的很寬敞的房間。更讓他高興的是,媽媽昨天對他說:“你的房間需要購買哪些物品,怎麼佈置,你說了算,只要不超過N元錢就行”。今天一早,金明就開始做預算了,他把想買的物品分為兩類:主件與附件,附件是從屬於某個主件的,下

Codeforces Round #519 by Botan Investments F. Make It One 組合數學+dp

題目連結:F 題意:給一串數字,讓你從中找出最少的數字,使得它們的最大公約數為1。   參考連結:https://blog.csdn.net/Link_Ray/article/details/83627570   題解:由2 * 3 * 5 * 7 * 1

[Codeforces 285E]Positions in Permutations容斥+DP

Address Meaning 稱一個 1∼n1\sim n1∼n 的排列 PPP 的完美數為:有多少個 iii 滿足 ∣Pi−i∣=1|P_i-i|=1∣Pi​−i∣=1 。 求有多少個長度為 nnn 的完美數恰好為 mmm 的排列。 Solution 考慮

Codeforces Round #248 (Div. 1)CAC自動機+DP

Tachibana Kanade likes Mapo Tofu very much. One day, the canteen cooked all kinds of tofu to sell, but not all tofu is Mapo Tofu, only those spicy enough

CodeForces 37 D.Lesson Timetable組合數學+dp

Description 有m個教室,第i個教室最多可以容納yi人上課,初始狀態第i個教室有xi人,a教室的人可以移動到b教室(a≤b),問移動後有多少種可能方案,結果模109+7 Input 第一

Codeforces Round #525 (Div. 2) E. Ehab and a component choosing problem貪心+樹形dp

E. Ehab and a component choosing problem time limit per test 1 second memory limit per test 256 megabytes input standard input output

Codeforces 808G Anthem of BerlandKMP+基礎DP

題意 給定一個字串 \(s\) ,一個字串 \(t\) ,其中 \(s\) 包含小寫字母和 "?" ,\(t\) 只包含小寫字母,現在把 \(s\) 中的問號替換成任意的小寫字母,求 \(t\) 最多在 \(s\) 中出現多少次,\(t\) 可以互相覆蓋。 \(1 \leq |s| \leq 10^5\)

CodeForces 140 E.New Year Garland組合數學+dp

Description n排,第i排li個位置,現在要給所有位置用m種顏色上色,需要滿足: 1.每一排相鄰位置不同色 2.相鄰排所用顏色集不同 問方案數,結果模p Input 第一行三個整數