NOI2015 壽司晚宴

2022-03-26 22:32:56 字數 2446 閱讀 6992

題目

這是一篇需要龜速乘的思博題解

我們考慮一下\(n\leq 30\)的睿智暴力,顯然質因數個數少得一批,互質的條件又等價於沒有公共的質因子,所以我們直接狀壓質因子,\(dp[i][s_1][s_2]\)表示前\(i\)個數考慮完了,第乙個人選擇的質因子狀態為\(s_1\),第二個人選擇的質因子狀態為\(s_2\),轉移的話就考慮當前這個數是給第乙個人,第二個人還是兩個人都不要就好了,顯然可以滾動陣列優化,又因為\(s_1\)和\(s_2\)不能有交,於是可以直接列舉補集

複雜度大概是\(o(n3^)\),\(\pi(n)\)表示不大於\(n\)的質數個數

我們發現\(n\leq 500\)時這個暴力不適用的原因是質因子個數太多了,但是考慮到乙個非常小學生的結論,乙個數\(n\)最多隻會有乙個超過\(\sqrt\)的質因子,於是我們可以考慮單獨討論這個超過\(\sqrt\)的質因子

狀態還是暴力\(dp\)的狀態,但是我們只壓不超過\(\sqrt\)的質因子,我們把所有數分解之後按照剩下的那個質因子排序,對於相同的質因子我們一起考慮,對於乙個具有相同超過根號質因子的區間,我們發現這裡面的數不能同時分給兩個人,這樣這個兩個人就會具有乙個相同的質因子了

對於一段最大值因子相同的區間,我們再做乙個\(dp\),設\(f[s]\)表示在這個區間裡選擇的數小於根號的質因子狀態為\(f\)的方案數,做完這個\(dp\)後我們就考慮把這些\(f\)分給第乙個人第二個人還是都不選,這裡的轉移還是一樣,也是需要保證小於\(\sqrt\)的質因子沒有交,這裡顯然需要乙個乘法,模數又是\(10^\)級別的,於是需要龜速乘一下

複雜度大概是\(o(n2^)}+(\pi(n)-\pi(\sqrt))5^)})\)

有點長的**

#include #define re register

#define ll long long

int n, len, o, l, is[505], p[505];

ll dp[2][257][257], f[505][257], mod;

struct number a[505];

inline int cmp(const number &a, const number &b)

inline void solve(int l, int r)

f[r][0] = (f[r][0] - 1 + mod) % mod;

}inline ll mul(ll a, ll b)

int main()

}for (re int i = 2; i <= n; i++)

a[i - 1].res = x, a[i - 1].s = s;

}for (re int i = 1; i <= p[0]; i++)

if (p[i] * p[i] <= n) ++len;

len = (1 << len) - 1;

std::sort(a + 1, a + n, cmp);

dp[0][0][0] = 1;

for (re int i = 1; i < n; i++)

memset(dp[o ^ 1], 0, sizeof(dp[o ^ 1]));

for (re int j = 0; j <= len; j++)

dp[o ^ 1][j][0] = (dp[o ^ 1][j][0] + dp[o][j][0]) % mod;

dp[o ^ 1][j | a[i].s][0] = (dp[o ^ 1][j | a[i].s][0] + dp[o][j][0]) % mod;

if ((a[i].s & j) == 0) dp[o ^ 1][j][a[i].s] = (dp[o ^ 1][j][a[i].s] + dp[o][j][0]) % mod;

}o ^= 1;

}for (re int i = l + 1; i <= n; i++)

dp[o ^ 1][j | k][0] = (dp[o ^ 1][j | k][0] + mul(dp[o][j][0], f[i - 1][k])) % mod;

if ((j & k) == 0) dp[o ^ 1][j][k] = (dp[o ^ 1][j][k] + mul(dp[o][j][0], f[i - 1][k])) % mod;}}

for (re int j = 0; j <= len; j++)

dp[o ^ 1][j][0] = (dp[o ^ 1][j][0] + dp[o][j][0]) % mod;

}l = i;o ^= 1;

}ll ans = 0;

for (re int i = 0; i <= len; i++)

for (re int j = 0; j <= len; j++)

if ((i & j) == 0) ans = (ans + dp[o][i][j]) % mod;

printf("%lld\n", ans);

return 0;

}

NOI 2015 壽司晚宴

description 為了慶祝 noi 的成功開幕,主辦方為大家準備了一場壽司晚宴。小 g 和小 w 作為參加 noi 的選手,也被邀請參加了壽司晚宴。在晚宴上,主辦方為大家提供了 n 1 種不同的壽司,編號 1,2,3,n 1,其中第 i 種壽司的美味度為 i 1 即壽司的美味度為從 2 到 n...

NOI 2015 壽司晚宴

4197 noi2015 壽司晚宴 time limit 10 sec memory limit 512 mb submit 813 solved 508 submit status discuss description 為了慶祝 noi 的成功開幕,主辦方為大家準備了一場壽司晚宴。小 g 和小 ...

NOI2015 壽司晚宴

嘟嘟嘟 昨天模擬t2 lba和dukelv都說和這題特別像 然而他倆還是沒做出來hhhh 我今天一看,果不其然,大體思路都一樣。但自認為這題比模擬題要難一些,自己也是因為沒有徹底理解浪debug了半天,導致費了很長時間。當 n leqslant 30 時,因為質數只有最多10個,所以可以狀壓每乙個數...