又被lhy大佬騙去探路了
然後我想了一會,沒有想出點什麼。。
我覺得有兩個原因:
1.我自己的實力的問題
2.晚上的腦子不是很好使
於是就去%題解了。。
然後看完其實覺得還是很水的。。
可能如果我狀態好的話,還是做的出來的
我們現在固定乙個看的方向,大概是這樣的
然後我們如果規定了乙個顏色是可以看到的,那麼剩下兩個顏色是幾乎看成沒什麼區別的
如果我們可以得到乙個陣列dp[i][j][k],表示前i行,用了j個方塊,k個是不能看的
那麼答案很明顯就是
dp[n][a][b+c]*c(b+c,b)然後選擇另外兩個都是一樣的,我這裡就不寫了
然後我們就考慮怎麼算出dp這個陣列
我們再想,如果我們可以得到乙個陣列g[x][y],表示我們在一列裡面,選擇x個能看的,y個不能看的,合法的方案是多少
那麼很明顯,我們就暴力列舉一下,每一列有多少個,然後乘一下,就可以dp出來了
那麼我們考慮怎麼求出g陣列
我們發現,有乙個東西也很煩,就是同一層的高度,它也可能會限制我們的方塊
於是我們考慮資料範圍很小,只有25
於是我們就可以暴力地設計乙個狀態
f[i][j][k][x][y]表示放置到第i行,這一行的高度為j,前i行放置的最高高度為k,已經用了x個能看見的方塊,y個不能看見的方塊的方案數
這麼的話你就暴力轉移就可以了
**由於noip將至,於是沒有寫
貼乙個出題人的**:
#include
#include
#define mod 1000000007
#define n 27
using
namespace
std;
intinline read()
while(ch>='0'&&ch<='9')
return x*f;
}int f[n][n][n][n][n<<1],g[n][n<<1],c[n<<1][n<<1],dp[n][n][n<<1];
int ans,a,b,c,n,m,t;
inline
void add(int &x,int y)
main()
for (int k=0;k<=m;k++)
for (int x=k;x<=m;x++)
for (int y=0;y<=(m<<1);y++)
add(g[x][y],f[n][0][k][x][y]);
c[0][0]=1;
for(int i=1;i<=(m<<1);i++)
}dp[0][0][0]=1;
for (int i=0;ifor (int j=0;j<=m;j++)
for (int k=0;k<=(m<<1);k++)
if (dp[i][j][k])
for(int x=0;j+x<=m;x++)
for(int y=0;y+k<=(m<<1);y++)
add(dp[i+1][j+x][y+k],(1ll*dp[i][j][k]*g[x][y])%mod);
while(t--)
}
洛谷U3348 A2 回文數
方方方很喜歡回文數,於是就有了一道關於回文數的題目。求從小到大第n 1 n 10 18 個回文數。注釋 出題人認為回文數不包括0。輸入格式 一行乙個正整數n。輸出格式 第n個回文數。輸入樣例 1 2333 輸出樣例 1 1334331 輸入樣例 2 12345678987654321 輸出樣例 2 ...
模擬 2018 9洛谷月賽T2
傳送門 一道模擬題?根據給出的條件可以分類討論列出關於k的不等式,然後求區間的交 但是求交不好求,可以轉化成求補集的並,還是挺常見的套路 具體實現還是很有技巧的,可以用結構體存這個點和它的型別 左端點or右端點 然後通過排序求並,具體細節看注釋 include include include inc...
l洛谷 NOIP提高組模擬賽 Day2
傳送門 t1 區間修改 單點查詢。差分樹狀陣列。include include include using namespace std const int maxn 10000005 inline intrd while isdigit ch return f?x x void out int x ...