51nod 2591 最終討伐

2022-05-08 03:24:08 字數 1499 閱讀 3742

敲51nod是啥評測機啊,好幾次都編譯超時然後同乙份**莫名奇妙在眾多0ms中忽然超時

這道題很簡單就是\(m\)名既被詛咒也有石頭的人,要麼就把石頭給沒有石頭被詛咒的人,然後互換身份,要麼就找一些人構成乙個置換圈,內部消化,\(n\)名有石頭沒詛咒的人不能把石頭給m,只能給沒石頭有詛咒的人

我們分開來考慮,先強制這\(m\)個人的其中一些一定會把石頭給\(n\)名沒有石頭被詛咒的人

設\(dp[i][j]\)為剩\(i\)對,有詛咒沒石頭,有石頭沒詛咒,\(j\)個有石頭有詛咒的人

那麼轉移是\(i \times j \times dp[i][j] \rightarrow dp[i][j - 1]\)

\(i \times i \times dp[i][j] \rightarrow dp[i - 1][j]\)

然後列舉有\(k\)個人組成了置換圈

方案數就是\(dp[0][k] \times (k!)^ \binom\)

#include #define fi first

#define se second

#define pii pair#define mp make_pair

#define pb push_back

#define space putchar(' ')

#define enter putchar('\n')

#define eps 1e-10

#define ba 47

#define maxn 2005

//#define ivorysi

using namespace std;

typedef long long int64;

typedef unsigned int u32;

typedef double db;

templatevoid read(t &res)

while(c >= '0' && c <= '9')

res *= f;

}templatevoid out(t x)

if(x >= 10)

putchar('0' + x % 10);

}const int mod = 998244353;

int n,m;

int dp[2005][2005],fac[4005],invfac[4005];

int inc(int a,int b)

int mul(int a,int b)

void update(int &x,int y)

int c(int n,int m)

int fpow(int x,int c)

return res;

}void solve()

if(i)

} }

int res = 0;

for(int i = 0 ; i <= m ; ++i)

out(res);enter;

}int main()

51Nod 1060 最複雜的數

把乙個數的約數個數定義為該數的複雜程度,給出乙個n,求1 n中複雜程度最高的那個數。例如 12的約數為 1 2 3 4 6 12,共6個數,所以12的複雜程度是6。如果有多個數複雜度相等,輸出最小的。input 第1行 乙個數t,表示後面用作輸入測試的數的數量。1 t 100 第2 t 1行 t個數...

51nod 1060 最複雜的數

1060 最複雜的數 ural 1748 基準時間限制 1 秒 空間限制 131072 kb 分值 40 難度 4級演算法題 把乙個數的約數個數定義為該數的複雜程度,給出乙個n,求1 n中複雜程度最高的那個數。例如 12的約數為 1 2 3 4 6 12,共6個數,所以12的複雜程度是6。如果有多個...

最複雜的數 51Nod 1060

反素數反素數 8005979?fr aladdin 題目等價於求1 n內最大的反素數 由其兩個性質 可以直接爆搜 還有注意細節處理 判斷當前值乘某個素因子是否符合條件時 要兩邊同除該素因子 否則爆long long include using namespace std define ll long...