BZOJ1025 [SCOI2009]游戏 置换群 + 背包dp

Posted Mychael

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BZOJ1025 [SCOI2009]游戏 置换群 + 背包dp相关的知识,希望对你有一定的参考价值。

题目链接

BZOJ1025

题解

题意就是问一个\(1....n\)的排列在同一个置换不断重复下回到\(1...n\)可能需要的次数的个数
和置换群也没太大关系
我们只需知道同一个置换不断重复,实际上就是每个循环节的元素不断在循环节上旋转,所需次数就是所有循环节长度的\(lcm\)
这一点很显然

而循环节数量是任意的,长度也可以是任意的,但总和一定是\(n\)
问题就转化为了有多少个数\(x\)能为总和为\(n\)的一些数的\(lcm\)
如果令\(x = \prod\limits_{i = 1} p_i^{k_i}\)
\(\sum\limits_{i = 1} p_i^{k_i} \le n\),那么\(x\)显然是可以被凑出来的
我们只需令每一个\(p_i{k_i}\)作为一个数,再补上一些\(1\)使得它们总和为\(n\),那么它们就是一个合法的\(lcm\)\(x\)的方案

问题就转化为了用\(\le n\)的一些质数\(p_i^{k_i}\)凑出\(\le n\)的数的方案数
显然就是一个分组背包问题

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<map>
#define Redge(u) for (int k = h[u],to; k; k = ed[k].nxt)
#define REP(i,n) for (int i = 1; i <= (n); i++)
#define mp(a,b) make_pair<int,int>(a,b)
#define cls(s) memset(s,0,sizeof(s))
#define cp pair<int,int>
#define LL long long int
using namespace std;
const int maxn = 1005,maxm = 100005,INF = 1000000000;
inline int read(){
    int out = 0,flag = 1; char c = getchar();
    while (c < 48 || c > 57){if (c == ‘-‘) flag = -1; c = getchar();}
    while (c >= 48 && c <= 57){out = (out << 3) + (out << 1) + c - 48; c = getchar();}
    return out * flag;
}
LL f[maxn],ans;
int n,p[maxn],pi,isn[maxn];
void init(){
    for (int i = 2; i <= n; i++){
        if (!isn[i]) p[++pi] = i;
        for (int j = 1; j <= pi && i * p[j] <= n; j++){
            isn[i * p[j]] = true;
            if (i % p[j] == 0) break;
        }
    }
}
int main(){
    n = read();
    init();
    f[0] = 1;
    for (int i = 1; i <= pi; i++){
        for (int j = n; j >= 0; j--){
            for (int k = p[i]; k <= j; k *= p[i])
                f[j] += f[j - k];
        }
    }
    for (int i = 0; i <= n; i++) ans += f[i];
    printf("%lld\n",ans);
    return 0;
}

以上是关于BZOJ1025 [SCOI2009]游戏 置换群 + 背包dp的主要内容,如果未能解决你的问题,请参考以下文章

BZOJ1025 [SCOI2009]游戏

bzoj1025: [SCOI2009]游戏(DP)

bzoj1025: [SCOI2009]游戏

BZOJ1025: [SCOI2009]游戏

bzoj 1025[SCOI2009]游戏 - 背包dp

bzoj1025 [SCOI2009]游戏——因数DP