標籤:哥德**猜想
質數(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互素的數的個數。思...