zoukankan      html  css  js  c++  java
  • cf415D Mashmokh and ACM(DP)

    题意:在1-n中选可重复的k个数组成一个数列,其中 b【i+1】 % b【i】 = 0 ,问你有多少种情况

    解题思路:dp,每增加一个数只与现在数列的最后一个数有关。

    解题代码:

     1 // File Name: d.c
     2 // Author: darkdream
     3 // Created Time: 2014年04月07日 星期一 01时29分35秒
     4 
     5 #include<stdio.h>
     6 #include<string.h>
     7 #include<stdlib.h>
     8 #include<time.h>
     9 #include<math.h>
    10 #include<limits.h>
    11 #define M 1000000007
    12 long long  ans[2001][2001];
    13 int a[2001][2001];
    14 int num[2001];
    15 int main(){
    16 
    17    //freopen("/home/darkdream/problem/input.txt","r",stdin);
    18    //freopen("/home/darkdream/problem/output.txt","w",stdout);
    19    int n , k ; 
    20    scanf("%d %d",&n,&k);
    21    memset(a,0,sizeof(a));
    22    memset(ans,0,sizeof(ans));
    23    memset(num,0,sizeof(num));
    24    for(int i = 1;i <= n; i ++)
    25    {
    26       for(int j = 1;j <= i; j++)
    27       {
    28          if(i % j == 0 )
    29          {    num[i] ++ ; 
    30             a[i][num[i]] = j; 
    31          }
    32       }
    33    }
    34   for(int i = 1;i <= n;i ++)
    35       ans[1][i] = 1; 
    36   for(int i = 2;i <= k;i ++)
    37      {
    38        for(int j = 1;j <= n;j ++)
    39            for(int s = 1; s <= num[j]; s++)
    40            {     ans[i][j] = ( ans[i][j]+ ans[i-1][a[j][s]]) % M;
    41               //   printf("%I64d %d %d
    ",ans[i-1][a[j][s]],i,j);
    42            }
    43      }
    44   long long rans = 0 ; 
    45   for(int i = 1; i <= n;i ++)
    46      rans = (rans + ans[k][i]) % M ; 
    47   printf("%I64d
    ",rans);
    48 return 0 ;
    49 }
    View Code
    没有梦想,何谈远方
  • 相关阅读:
    2-SAT·hihoCoder音乐节
    Music in Car
    Game with a Strip
    Oleg and Little Ponies
    组合数性质求K个数选取i*j个数分成j组的方案数
    Python学习笔记03
    Python学习笔记02
    Python 学习笔记01
    欺骗侦测
    Oracle 使用小计(4)
  • 原文地址:https://www.cnblogs.com/zyue/p/3649685.html
Copyright © 2011-2022 走看看