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