求從1-n中選k個數,使得這k個數的乘積不含完全平方因子
70% n≤
30
100% n≤
500
狀壓dp,f[
i][j
][k]
表示前i個數,選了j個,當前所選數之積分解質因數後的狀態為k(k表示成二進位制後,第一位表示有沒有2,第二位表示有沒有3……以此類推)令i+1分解質因數後狀態為po
s[i+
1] f
[i][
j][k
]→f[
i+1]
[j+1
][k|
pos[
i+1]
](k&
pos[
i+1]
=0)
f[i]
[j][
k]→f
[i+1
][j]
[k]
(考場**,求輕噴)#include
#define mod 1000000007
using
namespace
std;
inline
int getint()
while(isdigit(c))
return x*p;
}int primes[505],tot;
bool pd[505];
inline
void pre()
for(int j=1;j<=tot&&i*primes[j]<=500;++j)
}}inline
void putint(long
long x)
static
long
long buf[22];
long
long tot=0;
dowhile(x);
while(tot)putchar(buf[--tot]+'0');
}long
long f[35][13][2050];
long
long sum[35][13];
inline
void predp()}}
//cout}
}// for(int i=1;i<=6;++i)
// }
// }
for(int i=0;i<=30;++i)}}
}inline
void work1(int n,int k)
cout
void work(int n,int k)
int main()
return
0;}
先來做一道小學題:
證明當n=500時至多取96個數使它們滿足題意
取500中所有質數及1,共96個數,滿足題意
下證97及以上不可能
構造抽屜:
⋮ 共96個 當k
≥97時乙個抽屜裡至少有兩個數
明顯當乙個抽屜中有至少兩個數被選後,乘積一定包含完全平方因子 故k
max =96
(說了那麼多廢話,就是想吐槽n=
500,k≥
400 的資料是要鬧哪樣)
好了,抽屜擺在這裡,明顯,每個抽屜裡只能選乙個數
那麼答案就是
∏ 集合大小(了嗎)
*****
有些數(比如6)出現在了不止乙個集合中,這樣計算肯定是錯的
那就讓乙個數隻在乙個集合裡
…… ……
…… (woc,做不到啊)
乙個顯然的性質:乙個數x至多含有乙個質因數大於x√
好 重新分組
⋮
這樣就可以(了嗎
× 2)
還有些數沒有呢!
其餘數全部乙個數乙個桶
這樣每個桶選乙個後,大於n√
的質因數至多只有乙個
只用考慮小於的
用70%的dp
然後mle了
用滾動陣列,或直接參照0-1揹包的狀態優化
詳見**
#include
#define fe "mul"
#define mod 1000000007
using
namespace
std;
inline
int getint()
while(isdigit(c))
return x*p;
}int primes[505],tot;
bool pd[505];
inline
void pre()
for(int j=1;j<=tot&&i*primes[j]<=500;++j)
}}inline
void putint(long
long x)
static
long
long buf[22];
long
long tot=0;
dowhile(x);
while(tot)putchar(buf[--tot]+'0');
}int dp[100][260];
vector
bucket[505];
int pos[505];
inline
void add(int &a,int b)
inline
void work2(int n,int k)
while(primes[fi]for(int i=1;i<=n;++i)
if(temp%v==0)
}if(~pos[i])
else}}
memset(dp,0,sizeof(dp));
dp[0][0]=1;
for(int i=1;i<=n;++i)}}
}}
int ans=0;
for(int i=1;i<=k;++i)
}putint(ans),putchar('\n');
}inline
void work(int n,int k)
int main()
return
0;}
NOIP模擬(20171024)T3 數學
求滿足方程ax xa mod2n 的解的個數 n 30,a 109詢問組數t 1000 引理一 若a,b 均為奇數,且a2 k 1 b2k 1 mod2n 則a b mod2n 證明 a 2k 1 b2k 1 mod2n a 2k 1 b2k 1 0 mod2n a b a2k a2k 1b a2k...
NOIP模擬(10 30)T1 比賽
比賽 題目背景 10.30 noip 模擬t1 分析 暴力 將資料從小到大排序,從大到小找到第乙個滿足 a i k a i 1 的位置,那麼答案就是 n i 了,如果找不到那麼就是 n了 注意邊界 source created by scarlyw include include include i...
NOIP模擬(20171031)T3 紙帶
有乙個紙帶 每次區間染色,同乙個地方後染的顏色覆蓋先染的,求最後紙帶上顏色種類數。咦,這不是線段樹嗎?咦,倒過來做好像很方便啊?咦,離散化有坑?區間塗色,若該顏色所在區間均被染色,則該顏色按原順序操作後會被後面的顏色覆蓋 注意離散化 本來三個顏色3 8,2 5,7 9,最後6號點上顏色是1 離散化後...