Mashmokh and Numbers CodeForces - 415C
阿新 • • 發佈:2018-11-27
題意:就是n個數和k,每次按順序那兩個數,最大公約數的和為k。
思路:注意:當n=1,k>0時一定不存在,還有n=1,k=0時為1即可。
然後再正常情況下,第一組的最大公約數為k-n/2+1即可,後面是含有素數。(本來,配的是素數和素數+1, 然後會怕第一組會重複,後來直解兩個素數了,因為第一組要麼是特殊的素數要麼是合數所以麼有必要擔心重複)
#include<iostream> using namespace std; #define N int(1e7+10) int prime[N]; //第i個素數是prime[i] bool vis[N]; //表示i是否是被篩過(素數的倍數會提前被篩去)bool is_prime[N];//true表示是素數 int Prime(int n) { int cnt = 0; for (int i = 2; i <= n; ++i) { if (!vis[i]) { prime[cnt++] = i; is_prime[i] = 1;//表示是素數 } for (int j = 0; j < cnt&&i*prime[j] <= n; ++j) { vis[i*prime[j]] = 1; if (i%prime[j] == 0)break; //這裡就避免了 例子:6,在2就被篩去,避免了還要經過3又篩一遍。 } } return cnt; } int num[N]; int main() { int cnt = Prime(N); int n, k; scanf("%d%d", &n, &k); int t = n / 2; if (n == 1 && k == 0)printf("1\n"); else if(k < t || n < 2)printf("-1\n"); else{ printf("%d %d", (k - t + 1) * 2, (k - t + 1) * 3); for (int i = 3; i <= n; ++i) printf(" %d", prime[i]); } }