NOI2015 壽司晚宴

2022-08-19 22:33:08 字數 1595 閱讀 1377

portal

這題目真是神題.

因為a,b互質,那就代表a,b的質因數分解的素數集合交集是空集.

那麼只要兩者的集合的質因數分解的素數集是空集合.

考慮每個數最多只有1個超過\(\sqrt\)的因子, 那麼這樣算\(\sqrt\)以內最多有8個質數.

然後我們直接狀壓dp. 把大於等於22的大素因子單獨提出來, 按照這個進行處理.

dp[i][j][k]表示計算到第i個數字, 甲的狀態為j,乙的狀態為k, 這裡空間太小開不下, 所以滾動第一維.

這裡有乙個小trick,因為有部分數的最大素因子是相同的, 所以我們可以一起處理, 不用拷貝陣列, 這樣只要排一發序就可以了.

細節: 列舉狀態的時候必須從大到小列舉, 這裡和01揹包的原因相同.

#includeusing namespace std;

#define rep(i, a, b) for(ll i = (a), i##_end_ = (b); i <= i##_end_; ++i)

#define drep(i, a, b) for(ll i = (a), i##_end_ = (b); i >= i##_end_; --i)

#define clar(a, b) memset((a), (b), sizeof(a))

#define debug(...) fprllf(stderr, __va_args__)

typedef long long ll;

typedef long double ld;

ll read()

void write(ll x)

const ll maxn = 509, primes[9] = , maxmask = 301;

static ll n, mod;

void add(ll &x, ll y)

struct node

}s[maxn];

void separate(ll num)

s[index].bigger = num;

}void init()

static ll dp[maxmask][maxmask], f[2][maxmask][maxmask];

int cmp(node a, node b)

void solve()

drep (j, maxmask - 1, 0)

drep (k, maxmask - 1, 0)

if (i == n - 1 || s[i + 1].bigger != s[i].bigger || s[i].bigger == 1)

} }ll ans = 0;

rep (i, 0, maxmask - 1)

rep (j, 0, maxmask - 1)

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

cout << ans << endl;

}int main()

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 壽司晚宴

題目 這是一篇需要龜速乘的思博題解 我們考慮一下 n leq 30 的睿智暴力,顯然質因數個數少得一批,互質的條件又等價於沒有公共的質因子,所以我們直接狀壓質因子,dp i s 1 s 2 表示前 i 個數考慮完了,第乙個人選擇的質因子狀態為 s 1 第二個人選擇的質因子狀態為 s 2 轉移的話就考...