【題目描述】
czy要妥善安排他的後宮,他想在機房擺一群妹子,一共有n個位置排成一排,每個位置可以擺妹子也可以不擺妹子。有些型別妹子如果擺在相鄰的位置(隔著乙個空的位置不算相鄰),就不好看了。假定每種妹子數量無限,求擺妹子的方案數。
【輸入格式】
【輸出格式】
輸出只有乙個整數,為方案數(這個數字可能很大,請輸出方案數除以1000000007的餘數。
【樣例輸入】
2 2【樣例輸出】
【樣例說明】
七種方案為(空,空)、(空,1)、(1、空)、(2、空)、(空、2)、(1,1)、(2,2)。
【資料範圍】
20%的資料,1<n≤5,0<m≤10。
60%的資料,1<n≤200,0<m≤100。
100%的資料,1<n≤1000000000,0<m≤100。
但寫的太醜可能t一倆個點
前輩都忙著開後宮了,就我這個苦逼在弱校掙扎。。。
f[i][j]= i表示由i個妹子組成,j代表以j結尾
用異或狀態壓縮
60分:
1 #include2using
namespace
std;34
const
int mod=1000000007;5
6int n,m,ans,p=0;7
int f[2][101];8
bool d[101][101];9
char s[255
];10
11int
main()
1220
for(int i=0;i<=m;i++) f[0][i]=1;21
for(int i=2;i<=n;i++)
2231}32
for(int i=0;i<=m;i++)
33 ans=(ans+f[p][i])%mod;
34 cout35return0;
36 }
100分要用矩陣乘法配合圖論來做
f[i][k]表示從i到k的路徑條數,即以第i盆花開始,第k盆花結束的擺法有多少種
那麼f[i][k]=σ(f[i][j]*f[j][k])
即f=f*gn
配合快速冪
最後ans=σ(f[i][0])
1#define ll long long
23 #include4 #include5
using
namespace
std;67
const
int maxn=105;8
const
int mod=1000000007;9
10struct
mat11
f,g;
14ll n,m,ans;
15char ch[255
];16
17mat mult(mat a,mat b)
1828
29void modexp(int
b)3037}
3839
intmain()
4048
for(int i=0;i<=m;i++)
4953
modexp(n);
54for(int i=0;i<=m;i++)
55 ans=(ans+f.mat[i][0])%mod;
56 cout57return0;
58 }
noip模擬賽 czy的後宮
czy要妥善安排他的後宮,他想在機房擺一群妹子,一共有n個位置排成一排,每個位置可以擺妹子也可以不擺妹子。有些型別妹子如果擺在相鄰的位置 隔著乙個空的位置不算相鄰 就不好看了。假定每種妹子數量無限,求擺妹子的方案數。輸入格式 輸出格式 輸出只有乙個整數,為方案數 這個數字可能很大,請輸出方案數除以1...
2015 10 31的NOIP模擬賽
這是noip前的最後一周了。第一題是個組合數學的問題,規模不算太大。但第一反應就直接dp了,o n 2 的複雜度,始終想不到優化。本來看著1 3 4 6 10 15一串串數覺得多熟悉的,就是想不起來那是組合數。最後只有80分 第二題算是基本想到了吧,但是忽略了乙個問題 我的想法是每行0的個數要麼是當...
noip模擬賽 密碼
表示沒看懂演算法3 問題描述 有壓迫,就有反抗。mored的寵物在法庭的幫助下終於反抗了。作為乙隻聰明的寵物,他打算把魔法使mored的魔法書盜去,奪取mored的魔法能力。但mored怎麼會讓自己的魔法書輕易地被盜取?mored在魔法書上設定了乙個密碼鎖,密碼鎖上有乙個問題。施以斯臥鋪魔法吧,你有...