zoukankan      html  css  js  c++  java
  • Luogu P4161 [SCOI2009]游戏

    题意

    定义一个长度为 (n) 的置换的步数为将 (P=(1,2,cdots,n)) 在该置换操作下变回原样的最小次数。

    求有多少个 (K) 使得存在一个长度为 (n) 置换使得其步数为 (K)

    ( exttt{Data Range:}1leq nleq 10^3)

    题解

    类比一下这题我们可以得到如下转移方程:

    [f_{i,j}=f_{i,j-1}+sumlimits_{p_j^kleq i}f_{i-p_j^k,j-1} ]

    这里不需要乘 (p_j^k) 的原因是我只要求出 (K) 有多少而不是 (K) 的和,然后就没了。

    代码

    #include<bits/stdc++.h>
    using namespace std;
    typedef int ll;
    typedef long long int li;
    const ll MAXN=1e4+51;
    ll n,ptot;
    li res=1;
    ll prime[MAXN],np[MAXN]; 
    li f[MAXN];
    inline ll read()
    {
        register ll num=0,neg=1;
        register char ch=getchar();
        while(!isdigit(ch)&&ch!='-')
        {
            ch=getchar();
        }
        if(ch=='-')
        {
            neg=-1;
            ch=getchar();
        }
        while(isdigit(ch))
        {
            num=(num<<3)+(num<<1)+(ch-'0');
            ch=getchar();
        }
        return num*neg;
    }
    int main()
    {
        n=read(),f[0]=1;
        for(register int i=2;i<=n;i++)
        {
            if(!np[i])
            {
                prime[++ptot]=i;
            }
            for(register int j=1;i*prime[j]<=n;j++)
            {
                np[i*prime[j]]=1;
                if(!(i%prime[j]))
                {
                    break;
                }
            }
        }
        for(register int i=1;i<=ptot;i++)
        {
            for(register int j=n;j>=1;j--)
            {
                for(register int k=prime[i];k<=j;k*=prime[i])
                {
                    f[j]+=f[j-k];
                }
            }
        }
        for(register int i=1;i<=n;i++)
        {
            res+=f[i];
        }
        printf("%lld
    ",res);
    }
    
  • 相关阅读:
    centos 7.5 snmp 安装
    centos 7.5 telnet 离线安装
    使用httpClient发送请求(支持https)
    kafka基本概念
    List根据时间字符串排序
    mac安装yosys遇到`dyld: malformed mach-o image`报错
    ctags的--exclude选项
    每周分享(3)
    实践OKR极易出现的四大误区
    从OKR小白到成功落地OKR(三)
  • 原文地址:https://www.cnblogs.com/Karry5307/p/13455443.html
Copyright © 2011-2022 走看看