hdu4427 Math Magic dp

給出N,M,K
就是求能滿足以下條件的的方法數,(1,2)與(2,1)是兩種方式
lcm爲最小公倍數
gcd爲最大公約數
lcm(i,j)=i*j/gcd(i,j)

1. SUM (A1, A2, ..., Ai, Ai+1,..., AK) = N
2. LCM (A1, A2, ..., Ai, Ai+1,..., AK) = M

dp[i][j][k]=方法數   
i  ---- i個數
j  ---- 和爲j
k ---- 最小公倍數爲k
有一個常識,如果i爲x的因子,則i與x最小公倍數一定爲x
所以首先預先處理lcm(i,j),再把x的因子預先求出來,這樣就可以在這些因子中枚舉1~1000之內最多的因子數很小,所以可以得到優化

#include 
#include 
#include 
#include 
using namespace std;
const int N=1005;
const int mod=1e9+7;
int dp[2][1005][1005];
int lcm[N][N];
int fat[N];
int gcd(int x,int y)
{
    if(y==0)
        return x;
    return gcd(y,x%y);
}
int main()
{
    int n,m,k;
    for(int i=1;in) continue;
                        dp[e^1][tem][lcm[ll][fat[h]]]+=dp[e][j][ll];
                        int tt=dp[e^1][tem][lcm[ll][fat[h]]]%=mod;
                    //printf("%d %d %d\n",tem,lcm[ll][fat[h]],tt);
                    }
                }
            e^=1;
        }
        printf("%d\n",dp[e][n][m]);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章