\(\mathrm\) 最近在潛心研究數學, 他發現了一類很有趣的數字, 叫做無平方因子數。 也就是這一類數字不能夠被任意乙個質數的平方整除, 比如\(6\)、\(7\)、\(10\)都是無平方因子數, 而\(12\)則不是。
所以 \(\mathrm\) 在思考乙個問題——選擇不超過 \(k\) 個 \(n\) 以內的正整數乘起來, 使得乘積是乙個無平方因子數, 有多少種取法? (每個數只能取一次)
第一行乙個整數 \(t\) 表示資料組數。
接下來 \(t\) 行, 每行兩個整數 \(n\),\(k\), 意思如題面所述。
對於每一組資料, 輸出乙個整數表示取法的方案數對 \(10^9+7\) 取模後的數值。
\(10\%\)的資料: \(n≤8\);
\(40\%\)的資料: \(n≤16\);
\(70\%\)的資料: \(n≤30\);
\(100\%\)的資料: \(1≤t≤5\); \(1≤k≤n≤500\)。
70pts 有非常多種搞法,然而狀壓是最難寫的但是最可能繼續玩出正解的。。
可是我太菜,比賽時寫了個麻煩的狀壓
\(dp[i][j][s]\)代表前\(i\)個數選擇了\(j\)個素數狀態為\(s\)的方案數
code:
#include #include const int n=502;
int num[30][10],dat[30];
int pri[n],is[n],v[n],cnt,tot;
int div[n][100];
void init()
for(int j=1;j<=cnt&&i*pri[j]<=500;j++)
if(!flag) continue;
++tot;
dat[tot]=i;
for(int j=1;j<=12;j++)
if(div[i][j])
num[tot][j]=1;
}}int mod=1e9+7;
int n0,k;
int dp[20][20][1200];
void work()
for(int i=1;;i++)//選數個數上界
k=(k<=n?k:n);
memset(dp,0,sizeof(dp));
for(int i=0;i<=n;i++) dp[i][0][0]=1;
int ans=0;
for(int i=1;i<=n;i++)//前i個數
for(int j=1;j<=k;j++)//取了j個
for(int s=1;s<1<>q-1)&1) las^=1《而正解只是運用分組揹包的思想
注意到大於19的質數只可能出現乙個
那我們實際上就只需要找到狀壓2,3,5,7,11,13,17,19這幾個素數就行了
其他大於19的素數按照這個素數進行分組,剩下的同時按前幾個素數做就可以了
很巧妙的思想,然而資料不好造,答案一樣的期望炒雞高
code:
#include #include #include #define ll long long
const int n=500;
const ll mod=1e9+7;
const int pri[9]=;
using namespace std;
vector g[n+10];
int belong[n+10],sta[n+10],n,k;
void init()
else if(i%pri[j]==0) {belong[i]/=pri[j];sta[i]|=1<2018.8.20
安徽師大附中 你賽day9 T2 富 解題報告
出於某些原因,苟先生在追殺富先生。富先生所在的地方是乙個 n times m 的網格,苟先生排出了他的狼狗大軍,共有 k 條狗,第 i 條狗所在的位置為 x i,y i 每條狗每個時刻都可以向 8 個方向前進一步。如果乙個格仔最快的一條狗需要 t 時刻才能到,那麼這個格仔就是 t 危險的,現在給你 ...
安徽師大附中 你賽day4T2 演講解題報告
眾所周知,mathrm 是一名天天 mathrm 的高水平選手。作為一民長者,為了向大家講述自己 mathrm 的經驗,他決定在乙個禮堂裡為大家舉辦一場演講。這個禮堂擁有 n times m 個位子,排成 n 行 m 列。每個位子都有一盞燈,一開始有的燈是亮的,有的燈是滅的。這個禮堂十分詭異,人們操...
安徽師大附中 你賽day4T1 金字塔 解題報告
zdrcl 帶著妹子們來到了胡夫金字塔周邊旅遊,發現這裡正在進行乙個有關金字塔的遊戲 遊戲規則如下 1 這裡的金字塔是乙個 n 階的二維金字塔。2 把金字塔的每一層從上往下從 1 到 n 順次標號,對於第 i 層,有 2 i 1 個格仔,且第 i 層的格仔比第 i 1 層少的兩個格仔恰好是第 i 1...