zoukankan      html  css  js  c++  java
  • hdu 4427 Math Magic DP

    思路:

    dp[i][j][k]表示满足前i个数,和为j,lcm为k的数目。

    设a为解的第i+1个数。
    那么状态转移就为
    dp[i+1][j+a][lcm(a,k)]+=dp[i][j][k]。

    但是由于三维开不了,所以用滚动数组。

    代码如下:

     1 #include<iostream>
     2 #include<stdio.h>
     3 #include<algorithm>
     4 #include<iomanip>
     5 #include<cmath>
     6 #include<cstring>
     7 #include<vector>
     8 #define ll __int64
     9 #define pi acos(-1.0)
    10 #define MAX 1001
    11 #define M 1000000007
    12 using namespace std;
    13 int num[MAX],LCM[MAX][MAX],dp[2][MAX][MAX],cnt;
    14 int gcd(int a,int b)
    15 {
    16     while(b){
    17         int t=a;
    18         a=b;
    19         b=t%b;
    20     }
    21     return a;
    22 }
    23 int lcm(int a,int b)
    24 {
    25     return a/gcd(a,b)*b;
    26 }
    27 void init()//预处理出lcm
    28 {
    29     int i,j;
    30     for(i=1;i<MAX;i++){
    31         LCM[i][i]=i;
    32         for(j=1;j<i;j++)
    33             LCM[j][i]=LCM[i][j]=lcm(i,j);
    34     }
    35 }
    36 int main(){
    37     int t,n,m,k,i,j,now,v;
    38     init();
    39     while(scanf("%d%d%d",&n,&m,&k)!=EOF){
    40         cnt=0;
    41         for(i=1;i<=m;i++)
    42             if(m%i==0)
    43                 num[cnt++]=i;
    44         now=0;
    45         for(i=0;i<=n;i++)//不要用memset
    46             for(j=0;j<cnt;j++)
    47             dp[now][i][num[j]]=0;
    48         dp[now][0][1]=1;
    49         for(t=1;t<=k;t++){
    50             now^=1;
    51             for(i=0;i<=n;i++)//不要用memset
    52             for(j=0;j<cnt;j++)
    53             dp[now][i][num[j]]=0;
    54             for(i=t-1;i<=n;i++){
    55                 for(j=0;j<cnt;j++){
    56                     if(dp[now^1][i][num[j]]==0) continue;
    57                     for(v=0;v<cnt;v++){
    58                         int s=i+num[v];
    59                         int l=LCM[num[j]][num[v]];
    60                         if(s>n||m%l!=0) continue;
    61                         dp[now][s][l]+=dp[now^1][i][num[j]];
    62                         dp[now][s][l]%=M;
    63                     }
    64                 }
    65             }
    66         }
    67         printf("%d
    ",dp[now][n][m]);
    68     }
    69     return 0;
    70 }
    View Code
  • 相关阅读:
    转:JMeter5的If Controller操作解析
    .NET Core优秀的应用逻辑分层框架设计
    socket阻塞导致拿不到信息
    2018年开始了,我们还是说说2017吧
    PHP 学习 遇到坑的第一章
    记一次高并发情况,服务器和代码修改过程记录。
    IIS 提高连接的并发数,和CPU的使用率。
    2017年总结
    在 safari 浏览器 onclick 出现延迟的现象
    微信JS-api 注意事项
  • 原文地址:https://www.cnblogs.com/xin-hua/p/3282990.html
Copyright © 2011-2022 走看看