zoukankan      html  css  js  c++  java
  • BZOJ_1025_[SHOI2009]_游戏_(素数表+最小公倍数+DP)

    描述


    http://www.lydsy.com/JudgeOnline/problem.php?id=1025

    分析


    对于(n),转一圈回来之后其实是好几个环各转了整数圈.这些环中的数为(1,2,3,...,n).

    所以我们要求的就是将(n)分解成若干个数的和,这些数的最小公倍数的个数.

    我们用质因数分解的思路求最小公倍数.先筛出素数表.

    用(f[i][j])表示使用前(i)种素数构成数字(j)的种类数.

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 
     4 typedef long long ll;
     5 const int maxn=1000+5;
     6 int n,cnt;
     7 bool vis[maxn];
     8 int p[maxn];
     9 ll f[maxn][maxn];
    10 inline void prime(){
    11     for(int i=2;i<=n;i++){
    12         if(vis[i]) continue;
    13         p[++cnt]=i;
    14         for(int j=i*i;j<=n;j+=i) vis[j]=true;
    15     }
    16 }
    17 inline void solve(){
    18     for(int i=1;i<=n;i++) f[0][i]=1;
    19     for(int i=0;i<=cnt;i++) f[i][0]=1;
    20     for(int i=1;i<=cnt;i++)for(int j=1;j<=n;j++){
    21             f[i][j]=f[i-1][j];
    22             for(int k=p[i];k<=j;k*=p[i])
    23                 f[i][j]+=f[i-1][j-k];
    24     }
    25     printf("%lld
    ",f[cnt][n]);
    26 }
    27 int main(){
    28     scanf("%d",&n);
    29     prime();
    30     solve();
    31     return 0;
    32 }
    View Code

    1025: [SCOI2009]游戏

    Time Limit: 1 Sec  Memory Limit: 162 MB
    Submit: 1912  Solved: 1235
    [Submit][Status][Discuss]

    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

    HINT

    Source

  • 相关阅读:
    JDBC 实现对数据库表的增删查操作(案例)
    JDBC练习1 从控制台向数据库的表customers中插入一条数据
    JDBC PreparedStatement解决SQL注入问题
    JDBC PreparedStatement针对不同表的通用查询操作
    JDBC 针对数据库表的查询操作(2)
    JDBC 针对数据库表的查询操作(1)
    分布式锁
    浅谈Java线程安全
    Java线程池学习
    ACID
  • 原文地址:https://www.cnblogs.com/Sunnie69/p/5648958.html
Copyright © 2011-2022 走看看