ZOJ 3688 C The Review Plan II

據說是錯排公式的擴展,叫做限位排列。遞推公式如下:


但是因爲對1000000007取了模,所以其中的除法不一定能除盡,當然在數學意義上是能夠除盡的。可以用費馬小定理去掉除法:

若P爲質數,則 a^p = a mod P,即 a^(p-1) = 1 mod P。

但是這樣一來式中會出現三項相乘,用long long計算是必須的,此外每乘一次要取模,否則long long也可能溢出。

這次是觀賞了神奇的縮減行數的代碼風格。。

#include <stdio.h>
#define Mod 1000000007
typedef unsigned long long ull;

unsigned int a[100001];

unsigned int exp(int a)
{
	unsigned int n = Mod - 2;
	ull x = a, r = 1;
	for( ; n; n>>=1)
	{
		if(n & 1) r = r*x%Mod;
		x = x*x%Mod;
	}
	return r%Mod;
}

int main()
{
	a[0]=a[3]=1, a[1]=a[2]=0, a[4]=2;
	for(int i=5; i<100001; ++i)
		a[i]=(i*(i-2ull)%Mod*a[i-1]%Mod+(ull)i*a[i-2]%Mod+(i&1?4:-4))%Mod*exp(i-2)%Mod;
	for(int j; ~scanf("%d",&j); printf("%u\n", a[j]));
	return 0;
}




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章