1. 程式人生 > >【CF840C】On the Bench-DP+組合數學

【CF840C】On the Bench-DP+組合數學

測試地址:On the Bench
題目大意: 給出一個長為 n n 的序列 A A ,問有多少種 1

1 ~ n n 的排列 p p ,滿足對於任意 1
i < n 1\le i<n
,有 A P i
A P i + 1 A_{P_i}\cdot A_{P_{i+1}}
不為完全平方數。
做法: 本題需要用到DP+組合數學。
直接狀壓DP的複雜度應該是 O ( n 2 2 n ) O(n^22^n) 的,肯定會爆,我們需要進一步發掘條件的性質。
我們發現兩個數乘積為完全平方數這個性質有“傳遞性”,即若 a b a\cdot b 為完全平方數, b c b\cdot c 為完全平方數,則 a c a\cdot c 也為完全平方數。證明的話,我們只需要分開來看每個質因子的冪次的奇偶性即可,根據條件, a a c c 的各質因子的冪次應該關於模 2 2 分別同餘,而這也就意味著它們的冪次和一定為偶數,所以結論成立。
於是現在問題就簡化為,有 t o t tot 組數,共 n n 個數,要排成一排,同組數之間不能相鄰,問方案數。令第 i i 組數中數的個數為 n u m i num_i ,我們考慮一組一組進行轉移。
我們先忽略它們在最後整個排列中的絕對位置,只考慮它們目前的相對位置,即不考慮空格的存在。那麼令 f ( i , j ) f(i,j) 為前 i i 組陣列成的排列中,不合法的相鄰元素對數有 j j 對(以下簡稱為不合法位置有 j j 個)的方案數,我們考慮 f ( i 1 , j ) f(i-1,j) 會對 f ( i , x ) f(i,x) 產生什麼影響。
考慮第 i i 組如何擺放。首先我們把這一組的數拆成 k k 個連續段,這樣這一組數內部會產生 n u m i k num_i-k 個不合法位置,這一步的話,拆分有 C n u m i 1 k 1 C_{num_i-1}^{k-1} 種方案,而同組數內順序可以互換,不會產生其他影響,因此還要乘上一個 n u m i ! num_i! 。拆完後,要把這 k k 段插入到序列中,此時會對原來序列中的不合法位置產生一些影響。令插入到原來序列中不合法位置的段數為 l l ,顯然插入後不合法位置就會減少 l l ,而這樣插入的方案數應該為: C j l C l a s t + 1 j k l C_j^l\cdot C_{last+1-j}^{k-l} l a s t last 表示前 i 1 i-1 組數中元素數量之和,也就是插入前序列的長度,那麼上式應該就非常明顯了:在 j j 個不合法位置中選 l l 個插入,剩下的在合法位置選一些位置插入,因此就是兩個組合數的乘積。於是在列舉 k , l k,l 的基礎上,我們得到了 f ( i 1 , j ) f(i-1,j) 的貢獻:
f ( i 1 , j ) n u m i ! C n u m i 1 k 1 C j l C l a s t + 1 j k l f(i-1,j)\cdot num_i!\cdot C_{num_i-1}^{k-1}\cdot C_j^l\cdot C_{last+1-j}^{k-l}
而進行完這一些操作後,不合法位置數目變為 j + n u m i k l j+num_i-k-l ,因此這個貢獻應該累加在 f ( i , j + n u m i k l ) f(i,j+num_i-k-l) 中。於是最後的答案就是 f ( t o t , 0 ) f(tot,0) 了。
上面的轉移方程看上去是 O ( n 4 ) O(n^4) 的( i , j , k , l i,j,k,l ),但因為 k k 列舉的範圍只到 n u m i num_i ,因此實際上時間複雜度為 O ( n 3 ) O(n^3) ,可以通過此題。
以下是本人程式碼:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1000000007;
int n,num[310],sum[310],tot=0,belong[310];
ll a[310],f[310][310],fac[310],C[310][310];

int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		belong[i]=i;
		scanf("%lld",&a[i]); 
	}
	
	for(int i=1;i<=n;i++)
		if (belong[i]
            
           

相關推薦

CF840COn the Bench-DP+組合數學

測試地址:On the Bench 題目大意: 給出一個長為 n n n的序列

bzoj1925[Sdoi2010]地精部落 組合數學+dp

多少 rdquo 工作 左右 ash con sdoi2010 tdi dash 題目描述 傳說很久以前,大地上居住著一種神秘的生物:地精。 地精喜歡住在連綿不絕的山脈中。具體地說,一座長度為 N 的山脈 H可分 為從左到右的 N 段,每段有一個獨一無二的高度 Hi,其中

bzoj5004開鎖魔法II 組合數學+概率dp

sizeof pro double 預處理 lin mic 復雜度 時間復雜度 std 題目描述 有 $n$ 個箱子,每個箱子裏有且僅有一把鑰匙,每個箱子有且僅有一把鑰匙可以將其打開。現在隨機打開 $m$ 個箱子,求能夠將所有箱子打開的概率。 題解 組合數學+概率

BZOJ3093A Famous Game-概率論+組合數學

測試地址:A Famous Game 題目大意: 一個袋子裡有nnn個球,球的顏色只有紅和藍,紅色球的數目為000 ~ nnn的概率都是相等的。現在已經從裡面取出了ppp個球,其中qqq個是紅色,求下一

bzoj4145[AMPPZ2014]The Prices 狀壓dp

return std sin highlight string span 題目 狀態壓縮dp print 原文地址:http://www.cnblogs.com/GXZlegend/p/6832200.html 題目描述 你要購買m種物品各一件,一共有n家商店,你到第i家

DPUva437UVA437 The Tower of Babylon

塊存儲 ostream return www 轉移 targe cas solution ++ 傳送門 Description Input Output Sample Input 1 10 20 30 2 6 8 10 5 5 5 7

貪心/DP/單調隊列CF1029BCreating the Contest

swap cout const output i+1 隊列 octopus 描述 ++i Description 給你一個單調不下降的長度為n的序列,請你找出一個最長的子序列,滿足找出的子序列中,\(A_i<=A_{i-1}~\times~2\),其中i為下標,A為找

POJ3666Making the Grade 離散化+DP

class 一個 read 離散 print 個數 poj3666 esp void 學到了一個引理:在滿足S最小化的條件下,一定存在一種構造序列B的方案,使得序列B中的數值都來自於A中。(數學歸納法+中位數定理得證) 對於狀態的表示來說,首先肯定有一個 i ,表示選到了第

Codeforces 840C On the Bench - 動態規劃 - 組合數學

題目傳送門   傳送門I   傳送門II   傳送門III 題目大意   給定$n$個數,我們認為它們互不相同,即使它們數值上相等,問存在多少排列方式,使得任意兩個相鄰位置上的數的乘積不是完全平方數。   顯然一個正整數$x$可以被表示為$d_{1}\cdot s_{1}^

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

HDU1693Eat the Trees(插頭dp

【HDU1693】Eat the Trees(插頭dp) 題面 HDU Vjudge 大概就是網格圖上有些點不能走,現在要找到若干條不相交的哈密頓迴路使得所有格子都恰好被走過一遍。 題解 這題的弱化版本吧。。。 因為可以任意分配哈密頓迴路的數量,因此根本不需要再考慮插頭的配對問題了,那麼直接分情況轉移

UVA1401Remember the Word Trie+dp

題目大意:給定一個字串和一個字串集合,問從集合中選出若干個串組成給定母串的不同方案數。 題解:有些類似於揹包問題。狀態很好表示,為:\(dp[i]\) 表示母串前 i 個字元的不同方案數,因此,有狀態轉移方程為:\(dp[i]=\Sigma dp[j],s[j+1...i]=s_0,s_0\in set\)

C. On the Benchdp + 組合數)

題意 一個長度為 \(n\) 的序列 \(A\) ,定義一個 \(1\) 到 \(n\) 的排列 \(p\) 是合法的,當且僅當 \(\forall i \in [1, n − 1], A_{p_i} × A_{p_i+1}\) 不是完全平方數。 求有多少合法的排列,對 \(10^9 + 7\) 取模。 \(

HDU4836 The Query on the Tree dfs+線段樹

題目分析:首先如果不換根的話,就可以用dfs求時間戳+樹狀陣列維護即可。 現在多了換根操作,我們該怎麼處理? 首先因為換根並不會改變樹的結構,所以我們依舊dfs出一棵樹來。 對於修改,我們改變該點在樹狀陣列上對應位置的值即可。 對於換根,我們直接將root置為要換的節

bzoj3522[Poi2014]Hotel 樹形dp

pre 必須 += log style using fin col ret 題目描述 有一個樹形結構的賓館,n個房間,n-1條無向邊,每條邊的長度相同,任意兩個房間可以相互到達。吉麗要給他的三個妹子各開(一個)房(間)。三個妹子住的房間要互不相同(否則要打起來了),為了讓

BZOJ2510弱題 期望DP+循環矩陣乘法

mem ret sam include std bsp 都是 size 個數 【BZOJ2510】弱題 Description 有M個球,一開始每個球均有一個初始標號,標號範圍為1~N且為整數,標號為i的球有ai個,並保證Σai = M。 每次操作等概

BZOJ1786[Ahoi2008]Pair 配對 DP

names tro for family bzoj pac return border [0 【BZOJ1786】[Ahoi2008]Pair 配對 Description Input Output Sample Input 5 4 4 2 -1

hdu1556Color the ball——樹狀數組

can n) 實現 分享 ... 2個 tput ring font Problem Description N個氣球排成一排,從左到右依次編號為1,2,3....N.每次給定2個整數a b(a <= b),lele便為騎上他的“小飛鴿"牌電動車從氣球a開始到氣球b依

BZOJ1426收集郵票 概率DP 論文題 推公式題

pla align proc flow 考試 fin 思路 ng- length 鏈接: #include <stdio.h> int main() { puts("轉載請註明出處[輾轉山河弋流歌 by 空灰冰魂]謝謝");

POJ2983Is the Information Reliable? ——差分約束

存在 tail src init lose ati family fin turn 題目大意:一天南北線上有n個防禦站,給出他們之間的位置關系,問有沒有可能存在這樣一種位置布置符合所給的位置關系。關系有兩種,一種是 P A B X,表示A在B北邊X光年的位置,V A B表示