1. 程式人生 > >JZOJ-senior-5878. 【NOIP2018提高組模擬9.22】電路圖 A

JZOJ-senior-5878. 【NOIP2018提高組模擬9.22】電路圖 A

Time Limits: 1000 ms Memory Limits: 262144 KB

Description

nodgd 要畫一個電路圖。 這是一個很簡單的電路圖,所有的元件都是串聯關係,從整體來看就是一個環狀的結構。畫電路圖有很多要求,nodgd 為了畫得好看就又添加了一些 額外的要求。所有要求歸結起來有以下幾點: 1、這個環狀電路上有n個雙端電路元件(即每個電路元件有兩個連線導線的接頭),其中只有一個直流電源;為了本題方便,其他n − 1個元件都是一模一樣的電阻。 2、電流在電路圖中每經過一個元件,就必須拐一個90°的彎;沒有經過元件時不允許拐彎。參考下圖。 在這裡插入圖片描述 3、從電路圖整體上觀察,電流沿順時針方向流動,且電路不能自交。參考下圖。 在這裡插入圖片描述

4、如果一個符合題意的電路圖,可以通過整體旋轉一定的角度,再適當調整圖中導線的長度,得到另外一個符合題意的電路圖,則這兩個電路圖是相同的。參考下圖。 在這裡插入圖片描述 5、如果電路環路的內部存在一個點,使得它可以“看到”電路環路內部的所有位置,就認為這個圖是美觀的,反之是不美觀的。相同的電路圖不一定都美觀。參考下圖。 在這裡插入圖片描述 那麼問題來了,nodgd 想知道有多少種不同的電路圖,以及有多少種不同的美觀電路圖。由於兩個問題的答案都可能很大,請mod 1,000,000,007輸出結果。

Input

輸入檔案 A.in 輸入檔案第一行包含一個正整數n,表示包含電源在內的電路元件的總數量。

Output

輸出檔案 A.out。 輸出檔案第一行包含一個整數,表示不同的電路圖數量mod 1,000,000,007的結果。第二行包含一個整數,表示不同的美觀電路圖數量mod 1,000,000,007的結果。

Sample Input

【樣例1】 6 【樣例2&3】見下發檔案

Sample Output

【樣例1】 6 6

Data Constraint

對於 10%的資料,n = 12; 對於 30%的資料,n ≤ 24; 對於 60%的資料,n ≤ 5000; 對於 100%的資料,4 ≤ n ≤ 10^7,且n是個偶數。

Hint

【輸入輸出樣例 1 說明】 可以有如下幾種電路圖,電路圖數量是 6,所以輸出檔案第一行輸出一個整數 6; 容易發現,這 6 個電路圖都是美觀的電路圖,所以第二行也輸出一個整數 6。 在這裡插入圖片描述

Solution

看這很不友善的 NN ,就知道是個結論題啦

第一問: 題目中說每經過一個元件就必須拐一次彎,而由於電路圖是閉合的 不難發現右拐次數一定為左拐次數+4 所以 A

ns1Ans1 就是 Cnn/22C^{n/2-2}_{n}

第二問: 題目中要求的美觀實際上就是要求形成的電路圖為凸多邊形 觀察可知,不能連續兩次逆時針拐彎,否則就不美觀了 於是我們以最外圍的四條邊為分界,將路徑分成四段,手動畫一畫可以發現每段的拐彎數均為奇數 (最外圍的四條邊顧名思義就是最上最下最左和最右四條邊,最左邊的邊就是以那條邊為分界,所有邊都在它的右半邊,其他三條邊同理) 那麼問題轉化為將一個偶數 NN 拆分成 44 個奇數的方案數

我們先考慮將 NN 拆成 4 個偶數怎麼做 將 N/21N/2-1 個偶數排在一起形成一個序列,保證了每個偶數>0且<N 在它們之中選 33 個出來,這 33 個數相當於擋板,將序列分成了四個部分 假定選出來的 33 個數分別為 a,b,c(a&lt;b&lt;c)a,b,c(a&lt;b&lt;c),然後我們將間隔作為選擇的偶數 那麼這四個正偶數分別為 a,ba,cb,Nca,b-a,c-b,N-c 於是我們就可以得出方案數為 CN/213C^3_{N/2-1}

回到這題,要將 NN 分成 44 個正奇數 分成奇數,就相當於分成偶數後將每個偶數-1 於是我們類比上面的做法 我們將這四個奇數分別都加上1 ,則和為 N+4N+4 於是方案數為 C(N+4)/213C^3_{(N+4)/2-1},即 CN/2+13C^3_{N/2+1}

由於電源放任意位置都可以,所以要乘上 NN 又因為整體旋轉後相同的電路圖都是一樣的,所以還要除以4

最終, Ans2=CN/2+13N/4Ans2=C^3_{N/2+1}*N/4

Code

#include<algorithm>
#include<cstdio>

#define fo(i,a,b) for(int i=a;i<=b;++i)
#define fd(i,a,b) for(int i=a;i>=b;--i)
#define ll long long

using namespace std;

const int N=1e7+5,P=1e9+7;
int n,jc[N],ny[N];

int ksm(int x,int y)
{
	int s=1;
	for(;y;x=(ll)x*x%P,y>>=1)
		if(y&1) s=(ll)s*x%P;
	return s;
}

ll C(int n,int m)
{
	return (ll)jc[n]*(ll)ny[m]%P*(ll)ny[n-m]%P;
}

int main()
{
	freopen("a.in","r",stdin);
	freopen("a.out","w",stdout);
	scanf("%d",&n);
	jc[0]=1;
	fo(i,1,n) jc[i]=(ll)jc[i-1]*i%P;
	ny[n]=ksm(jc[n],P-2);
	fd(i,n-1,0) ny[i]=(ll)ny[i+1]*(i+1)%P;
	ll a1=C(n,n/2-2);
	ll a2=C(n/2+1,3)*n%P*ksm(4,P-2)%P;
	printf("%lld\n%lld",a1,a2);
}