汕頭市選2014 舞伴 perm

2021-07-27 14:17:10 字數 1150 閱讀 9612

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....