• BZOJ_1025_[SCOI2009]游戏_DP+置换+数学


    BZOJ_1025_[SCOI2009]游戏_DP+置换

    Description

      windy学会了一种游戏。对于1到N这N个数字,都有唯一且不同的1到N的数字与之对应。最开始windy把数字按
    顺序1,2,3,……,N写一排在纸上。然后再在这一排下面写上它们对应的数字。然后又在新的一排下面写上它们
    对应的数字。如此反复,直到序列再次变为1,2,3,……,N。
    如: 1 2 3 4 5 6 对应的关系为 1->2 2->3 3->1 4->5 5->4 6->6
    windy的操作如下
    1 2 3 4 5 6
    2 3 1 5 4 6
    3 1 2 4 5 6
    1 2 3 5 4 6
    2 3 1 4 5 6
    3 1 2 5 4 6
    1 2 3 4 5 6
    这时,我们就有若干排1到N的排列,上例中有7排。现在windy想知道,对于所有可能的对应关系,有多少种可
    能的排数。

    Input

      包含一个整数N,1 <= N <= 1000

    Output

      包含一个整数,可能的排数。

    Sample Input

    【输入样例一】
    3
    【输入样例二】
    10

    Sample Output

    【输出样例一】
    3
    【输出样例二】
    16

    题面可以简化为n个数,任意分段,每段大小的lcm有多少种情况。
    考虑求哪些数是可以作为lcm
    因为可以1个1个放,n的答案包括1~n-1的所有答案。
    把lcm表示成pi^ki这种形式,可以证明对于每个数,只取pi^ki能够使得总和最小(废话,因为每个数最少取这么多)
    那我们就只考虑每个数取pi^ki这种情况。
    设f[i][j]表示考虑前i个质数,当前所有pi^ki的和是j的方案数。
    转移就很简单了。
     
    代码:
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <cstdlib>
    using namespace std;
    #define N 1050
    typedef long long ll;
    int prime[N],cnt,n,vis[N];
    ll f[N][N],ans;
    int main() {
        scanf("%d",&n);
        int i,j,k;
        for(i=2;i<=n;i++) {
            if(!vis[i]) prime[++cnt]=i;
            for(j=1;j<=cnt&&i*prime[j]<=n;j++) {
                vis[i*prime[j]]=1;
                if(i%prime[j]==0) break;
            }
        }
        f[0][0]=1;
        for(i=1;i<=cnt;i++) {
            for(j=0;j<=n;j++) f[i][j]=f[i-1][j];
            for(j=prime[i];j<=n;j*=prime[i]) {
                for(k=j;k<=n;k++) f[i][k]+=f[i-1][k-j];
            }
        }
        for(i=0;i<=n;i++) ans+=f[cnt][i];
        printf("%lld
    ",ans);
    }
    
  • 相关阅读:
    入门菜鸟
    FZU 1202
    XMU 1246
    Codeforces 294E Shaass the Great 树形dp
    Codeforces 773D Perishable Roads 最短路 (看题解)
    Codeforces 814E An unavoidable detour for home dp
    Codeforces 567E President and Roads 最短路 + tarjan求桥
    Codeforces 567F Mausoleum dp
    Codeforces 908G New Year and Original Order 数位dp
    Codeforces 813D Two Melodies dp
  • 原文地址:https://www.cnblogs.com/suika/p/9427147.html
Copyright © 2020-2023  润新知