杭二集訓 質數

2021-08-14 15:49:11 字數 1572 閱讀 7489

標籤:哥德**猜想

質數(prime)

【題目描述】

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

【輸入資料】

一行乙個正整數n。

【輸出資料】

第一行乙個正整數m表示最少集合數,第二行n個[1,m]中的整數,第i個整數表示i在第幾個集合中。若有多種方案輸出任意一種即可。若無解輸出-1。

【樣例輸入】

8【樣例輸出】

2 1 2 2 1 1 1 1 2

【資料範圍】

對於30%的資料,n<=20。

對於100%的資料,n<=6000。分幾

種情況討

論:設m

為∑i=

1ni

1. m為質數,那麼直接輸出1

2. m為合數且為偶數,根據哥德**猜想:任何乙個大於2的偶數都能表示為兩個質數的和,輸出2

3. m為合數且為奇數,如果m-2為質數的話,那麼分為2和m-2兩個質數,答案為2,

4. m為合數且為奇數,如果m-2不是質數的話,分為3和m-3,其中m-3確定為偶數,再次根據哥德**猜想,可以將m-3再次劃分為2組,所以答案為3

5. n==1或0,那麼輸出無解-1

#include

#include

#include

#include

#include

#include

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

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

#define ll long long

#define mem(x,num) memset(x,num,sizeof x)

#define reg(x) for(int i=last[x];i;i=e[i].next)

using

namespace

std;

inline ll read()

while(ch>='0'&&ch<='9')

return x*f;

}const

int maxn=1e6+6;

bool is_prime[maxn];

int prime[maxn],cnt,n,vis[maxn];

ll s;

void getprime()

}}bool check(ll x)

int main()

rep(i,1,n)s+=i;

//coutif(s%2==0)

cout

<<'2'

<1,n)if(vis[i])cout

<<"2 ";else

cout

<<"1 ";cout

0; }else

if(check(s-2))else

}rep(i,1,n)if(!vis[i])cout

<<"3 ";else

cout

<' ';cout

0; }

}

杭二集訓 2019 8 17

題目意思 給出l,r,p,求區間 l,r 之間有多少數的最小質因子是p。資料範圍 1 l r 1000000000,1 p 1000000000 考慮設 f x,y 表示從1到 x 中最小質因子為 y 的數的個數,則有 f x,y lfloor rfloor sum rfloor,y 1 f lfl...

第二週集訓總結

這一周下來主要是對上乙個週看的前三章做乙個 的實現,雖然 有模板和例題,但是仍然有幾個演算法沒有完成實現。對於第一章的內容,我關注的重點是二進位制轉化和二分,在這週的最後幾天也有狂刷二分的題 雖然並沒有刷太多道 但是對二分的題目還是不太熟悉。昨天的最後一道題,一開始並沒有想到用二分,但是在別人拿到一...

8 1 集訓日記

今天看了有關容斥原理的幾篇部落格。容斥原理的基本思想是 先不考慮重疊的情況,把所有物件的數目求出,然後再把計數時重複計算的數目排斥出去,使得計算的結果既無遺漏又無重複。首先是乙個經典的互素問題 hdoj 4135 co prime 題目大意是 給定a,b,n,求區間 a,b 中與n互素的數的個數。思...