NOIP模擬(20171024)T2 乘積

2021-08-09 18:34:31 字數 3130 閱讀 1863

求從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 離散化後...