題解:因為小於根號500的質數有8個,我們可以用二進位制表示為放入的這些數已經含有前面8個質數的哪幾個然後,因為選擇1-k個數後相乘起來沒有平方因子,所以有任何能除以這前面8個質數的平方的都不可以,還有就是如果這個數把這8個質數能取餘等0的都除後等於1的話那麼這個數應該在自己這個數這一組,如果不能等於1的話應該再除以後剩下的那一組,為什麼呢?因為除以後就剩下它的結果很顯然只剩下乙個質數了,那麼這些數不能同出現,所以分到同一組裡面,如果等於1的話這些數可能同時出現,也可能不同時出現,但是可以用二進位制表現出來,最後用二維dp來做那麼轉移方程就是:
if((k&d)==0) dp[j+1][k|d] = (dp[j+1][k|d]+dp[j][k])%mod;(j表示放了j個數,k,d用二進位制表示含有前面8個質數的哪幾個)
#include#include#include#include#include#includeusing namespace std;
typedef long long int ll;
const ll mod = 1e9+7;
const int mx = 505;
int st[mx],belong[mx];
ll dp[mx][mx];
vectorv[mx];
int p = ;
ll work(int n,int m)
}ll ans = 0;
for(int i = 1; i <= m; i++)
for(int j = 0; j <(1<<8); j++)
ans = (ans+dp[i][j])%mod;
return ans%mod;
}int main()
return 0;
}
hdu 6125 狀壓dp 分組
一道玄學題.其實一開始想的是對的,優化一下就好了 首先我們會發現,乘積不能被完全平方數整除等價於所有因子的每個質因子個數和都至多為1 可是500以內的質數很多,全找出來會 的 可我們會發現,如果乙個數的平方會在500以內,那麼這個數一定 22!所以,1 500中會存在的完全平方數的質因子一定在22以...
分組揹包 hdu3033
題意 有k種品牌的鞋子,要每種都收集到至少乙個,有n雙鞋子,給出輸入 屬於那種品牌,花費,收藏價值。每雙鞋子只可以買一雙,問收藏價值最大能多少 思路 既然每種只能一雙那一定01揹包。但是又要求每種必須有乙個,因此對於每種品牌的鞋子都需要進行遍歷。分析 分組揹包問題其實只是將01揹包問題使用二維化陣列...
hdu4341 Gold miner 分組揹包dp
題意 和 礦工差不多。人在 0,0 有n種金,遊戲時間為t。告訴你每種金的位置 x,y 獲得該金需要的時間的t,以及它的 價值。且若人和多塊金子共線時,只能先取最近的金子。問在遊戲時間內可獲得最大價值。思路 對於共線的金,我們將其分為一組,並按照距 0,0 的距離排序,那麼選該點的價值為前面所有的價...