GDOI2018模擬7 8 質數

2021-08-03 14:42:29 字數 1121 閱讀 7109

將1~n分成盡可能小的集合,使得每個集合的元素均為質數

乙個數n(n<=6000)

第一行乙個數m表示分成幾塊

第二行n個1~m的數表示每個數分到哪一塊

2 1 2 2 1 1 1 1 2

這題很有趣

我們知道有個哥德**猜想:任意乙個足夠大的偶數可以分成兩個質數的和

由於目前人類沒有證明出它是錯的,而且在6000以內通過列舉可以證明這是正確的

那麼就直接用

分成幾種情況考慮 記m

=∑ni

=1i

如果m為質數,顯然分一塊

如果m為偶數,可以列舉質數分成兩塊

如果m為奇數,並且m-2為質數,可以分成兩塊,分別是2和其它的數

否則分為三塊,m-3會變成偶數,可以分成兩塊,第三塊為3,可以證明這是正確的(至少在6000以內可以通過列舉證明)

#include

#include

#include

#include

#define fo(i,a,b) for(int i=a;i<=b;i++)

#define fd(i,a,b) for(int i=a;i>=b;i--)

#define n 18003001

using namespace std;

int ans,a[n],p[n],bz[n],flag,n;

int main()

bz[1]=1;

fo(i,2,n-1)

}int jy=(1+n)*n/2;

if(bz[jy]==0)

if(jy%2==0)

printf("2\n");

fo(j,1,n) printf("%d ",a[j]==1?1:2);

return

0; }

}else

else

}fo(i,1,p[0]) if(bz[jy-p[i]]==0)

printf("3\n");

fo(j,1,n) printf("%d\n ",a[j]>1?a[j]:1);

return

0; }}}

}

GDOI2018模擬8 11 決戰

聽說暴力狀壓可以過?然而我常數不好只有90分 考慮普通的狀壓,f i s j 表示當前填到第i行,第i行的狀態為s,用了j個哲學 家的方案數 我們把最後一維看做多項式,用x j的係數表示答案 咦?模數是998244353哦,那我們是不是可以用ntt加速呢?如果我們求出對於所有wi 答案的多項式的點值...

GDOI2018模擬8 14 神奇的矩陣

輸出一行表示答案 3 3 2 1 2 3 4 5 6 7 8 9 真是神奇的一道題 為了避免絕對值的影響,讓每個數字從小到大加入,對於每個數字考慮貢獻 設f i j 表示以 i,j 為左上角的k k的矩陣中有數的個數 那麼乙個數在加入時,所有包括它的k k矩陣的f的和,就是這個數對答案做的正貢獻 那...

GDOI2018模擬9 14 通訊

比賽沒有仔細想,碼了個n2 暴力,結果還被卡常了。暴力思路如下 先列舉根為x,依次加入x 1,x 2,x 3 加入乙個點y y x 時,如果它的子樹中沒有已經加入的點,那麼它就會使距離增大,再暴力往上跳,給它的祖先打上標記,直到到某個點,這個點已經被打上標記就可以停止了,同時可以算出增加的距離。感覺...