1. 程式人生 > 實用技巧 >某中學校園網路建設過程中虛擬化的實施(四)

某中學校園網路建設過程中虛擬化的實施(四)

A - Suborrays

題意

構造一個數組,使他的所有\(i---j\)的異或和都大於\(j-i+1\)

分析

因為異或是不進位加法,所以說保證\([i,j]\)中有位數比長度大的數即可
因此,小的數往兩邊放,大的數往中間放。

C - Cyclic Permutations

題意

根據一個數組生成一個樹,對於陣列中的任意一個\(a_i\),找到兩邊最靠近他的且大於他的\(a_j\),則\(i、j\)相連。問對於n大小的陣列有多少種排列方式。

分析

但是直接考慮存在環的情況比較複雜,考慮不存在環的情況

不存在環,就是對於每個i ii不能同時向左右連邊

也就是有麼只有左邊有數比它大,要麼只有右邊有數比它大

換言之就是要麼左邊都比自己小,要麼右邊都比自己小

這其實構成了一個單峰函式這其實構成了一個單峰函式這其實構成了一個單峰函式

前面一直遞增到峰值n,後面一直遞減。

注意到這樣一個事實,除了n這個特殊的數

其他數都有比自己大的數,也就是一定會至少往外連一條邊其他數都有比自己大的數,也就是一定會至少往外連一條邊其他數都有比自己大的數,也就是一定會至少往外連一條邊

這樣就就必定會連n−1條邊,構成一顆樹這樣就就必定會連n-1條邊,構成一顆樹這樣就就必定會連n−1條邊,構成一顆樹

在樹的基礎上,無論多加任何一條邊都會形成環在樹的基礎上,無論多加任何一條邊都會形成環在樹的基礎上,無論多加任何一條邊都會形成環

那麼想構成樹,每個數比自己大的數都落在自己的一側(保證只向一側連邊)那麼想構成樹,每個數比自己大的數都落在自己的一側(保證只向一側連邊)那麼想構成樹,每個數比自己大的數都落在自己的一側(保證只向一側連邊)

再次得到結論,前面遞增到n,後面遞減再次得到結論,前面遞增到n,後面遞減再次得到結論,前面遞增到n,後面遞減。
答案就是\(n!-2^{n-1}\)

程式碼


const int p=1e9+7;
int jie(int n)
{
	int ans=1;
	for(int i=1;i<=n;i++)
	{
		ans*=i;
		ans%=p;
	}
	return ans;
}
int qpow(int x,int y)
{
	if(y==0)return 1;
	if(y%2==0)
	{
		int temp=qpow(x,y/2); 
		return temp*temp%p;
	}
	else
	{
		return x*qpow(x,y-1)%p;
	}
}
main(void)
{
	int n=read();
	printf("%lld",(jie(n)-qpow(2,n-1)+p)%p);
}