n 個男孩,n 個女孩,男孩和女孩可能是朋友,也可能不是朋友。現在要組成n 對舞伴,要求每對舞
伴都是一男一女,且他們是朋友。
統計不同配對方案的數量,因為結果很大,所以只要求除以m 的餘數。
第1 行,2 個整數n,m。接下來n 行,每行n 個整數aij,表示第i 個男孩和第j 個女孩的關係。如果他們是朋友,則aij = 1,否則aij = 0。
1 個整數,表示所求的值。
3 1000000000
1 1 1
1 1 1
1 1 1
• 對於50% 的資料,n <= 9;
• 對於100% 的資料,1 <= n <= 20, 1 <= m <= 10^9; 0 <= aij <= 1
n才20,很明顯的狀壓嘛
設f[i,s]表示做完前i個男生,女生被匹配的狀態為s的方案數
列舉i,s接著列舉第i個男生選了哪個女生,然後轉移
但是注意,狀態s中1的數量只能是i,所以要注意在這裡進行優化時間,否則會超時
#include
#include
#include
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define n 25
#define ll long long
using
namespace
std;
int a[n][n],e[21],n,ks[n],en[n];
struct nodek[1048576];
ll mo,f[n][1048576];
bool cnt(node x,node y)
sort(k+1,k+1048576,cnt);
fo(s,1,e[20]-1) if(k[s].y!=k[s-1].y) ks[k[s].y]=s,en[k[s].y-1]=s-1;
en[20]=ks[20];
scanf("%d %lld",&n,&mo);
fo(i,1,n) fo(j,1,n) scanf("%d",&a[i][j]);
f[0][0]=1;
fo(i,1,n)}}
printf("%lld\n",f[n][e[n]-1]);
}
汕頭市選 2014 舞伴
n 個男孩,n 個女孩,男孩和女孩可能是朋友,也可能不是朋友。現在要組成n 對舞伴,要求每對 伴都是一男一女,且他們是朋友。統計不同配對方案的數量,因為結果很大,所以只要求除以m 的餘數。對於50 的資料,n 9 對於100 的資料,1 n 20,1 m 10 9 0 aij 1。這題觀察資料不難發...
JZOJ 3632 汕頭市選2014 舞伴
n 個男孩,n 個女孩,男孩和女孩可能是朋友,也可能不是朋友。現在要組成n 對舞伴,要求每對舞 伴都是一男一女,且他們是朋友。統計不同配對方案的數量,因為結果很大,所以只要求除以m 的餘數。第1 行,2 個整數n,m。接下來n 行,每行n 個整數aij,表示第i 個男孩和第j 個女孩的關係。如果他們...
jzoj P1845 汕頭市選2014 約數
題解 我們發現,這題有一點點規律我們可以用塞素數的方法做。按順序,每次把沒被塞掉的i的倍數全部塞出來 包括i 並且有多少個就加上多少個i,因為這時i是除了1以外他們的最小約數。最後如果全部數都被塞完了,就不用做下去了。注意若i的某個倍數,之前已經被塞出去了,就不用累加i。var a array 0....