• bzoj1025


    想到是lcm 但是没有想到这么奇怪的背包dp。。。

    题解跪lsj

     1 #include<bits/stdc++.h>
     2 #define lowbit(a) ((a)&(-(a)))
     3 #define clr(a,x) memset(a,x,sizeof(a))
     4 #define rep(i,l,r) for(int i=l;i<(r);i++)
     5 typedef long long ll;
     6 using namespace std;
     7 int read()
     8 {
     9     char c=getchar();
    10     int ans=0,f=1;
    11     while(!isdigit(c)){
    12         if(c=='-') f=-1;
    13         c=getchar();
    14     }
    15     while(isdigit(c)){
    16         ans=ans*10+c-'0';
    17         c=getchar();
    18     }
    19     return ans*f;
    20 }
    21 const int maxn=1009,maxp=100000;
    22 int n,cnt=1,p[maxp];
    23 ll d[maxn][maxn];
    24 bool isp[maxp];
    25 void get_prime(){
    26     clr(isp,-1);
    27     rep(i,2,n+1){
    28         if(isp[i]) p[cnt++]=i;
    29         rep(j,1,cnt){
    30             if(i*p[j]>n) break;
    31             isp[i*p[j]]=0;
    32             if(i%p[j]==0) break;
    33         }
    34     }
    35 }
    36 void solve(){
    37     d[0][0]=1;
    38     rep(i,1,cnt){
    39         rep(j,0,n+1){
    40             d[i][j]=d[i-1][j];
    41             int t=1;
    42             rep(k,0,n){
    43                 t*=p[i];
    44                 if(t>j) break;
    45                 d[i][j]+=d[i-1][j-t];
    46             }
    47         }
    48     }
    49     ll ans=0;
    50     rep(i,0,n+1) ans+=d[cnt-1][i];
    51     cout<<ans;
    52 }
    53 int main()
    54 {    
    55     n=read();
    56     get_prime();
    57     solve();
    58     return 0;
    59 }
    View Code

    1025: [SCOI2009]游戏

    Time Limit: 1 Sec  Memory Limit: 162 MB
    Submit: 1561  Solved: 979
    [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。

    Output

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

    Sample Input

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

    Sample Output

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

    HINT

    【数据规模和约定】

    100%的数据,满足 1 <= N <= 1000 。

    Source

     
    [Submit][Status][Discuss]
  • 相关阅读:
    Codeforces Round #375 (Div. 2)
    ACM之路(19)—— 主席树初探
    CodeForces 722D Generating Sets
    CodeForces 721D Maxim and Array
    心情--2014区域赛
    【N-Quens II】cpp
    【N-Queens】cpp
    【Unique Paths II】cpp
    【Unique Paths】cpp
    【Palindrome Partitioning】cpp
  • 原文地址:https://www.cnblogs.com/chensiang/p/4740695.html
Copyright © 2020-2023  润新知