Codeforces 476D Dreamoon and Sets 规律+构造

题目链接:点击打开链接

题意:

输出n组集合,每组4个。

对于任意一组中的4个元素,一组内任意2个数的gcd==k

且n组的所有数字各不相同。

要使得n组中最大的数字最小。

问:

输出最大的那个数,并输出n组的数字。

思路:

首先能得到,当把这组数字都/k,则任意两个数互质。

然后就是规律:

1 2 3 5

7 8 9 11

对应+6

#include <cstdio>
#include <iostream>
#include <cstring>
#include <queue>
#include <algorithm>
#include <map>
#include <set>
#include <cmath>
template <class T>
inline bool rd(T &ret) {
    char c; int sgn;
    if(c=getchar(),c==EOF) return 0;
    while(c!='-'&&(c<'0'||c>'9')) c=getchar();
    sgn=(c=='-')?-1:1;
    ret=(c=='-')?0:(c-'0');
    while(c=getchar(),c>='0'&&c<='9') ret=ret*10+(c-'0');
    ret*=sgn;
    return 1;
}
template <class T>
inline void pt(T x) {
    if (x <0) {
        putchar('-');
        x = -x;
    }
    if(x>9) pt(x/10);
    putchar(x%10+'0');
}
using namespace std;
typedef long long ll;
#define N 200010
const ll mod = 1000000007;

ll n, k, ans;
vector<ll>G[10001];
ll gcd(ll a, ll b){
	if(a>b)swap(a,b);
	while(a){
		b %= a; swap(a,b);
	}
	return b;
}

void solve(int x){
	G[x].clear();
	if(x==1){
		G[x].push_back(1);
		G[x].push_back(2);
		G[x].push_back(3);
		G[x].push_back(5);
	}
	else {
		G[x].push_back(G[x-1][0]+6);
		G[x].push_back(G[x-1][1]+6);
		G[x].push_back(G[x-1][2]+6);
		G[x].push_back(G[x-1][3]+6);
	}
}
int main() {
	while(cin>>n>>k){
		ans = 1;
		for(int i = 1; i <= n; i++)solve(i);
		pt((G[n][3])*k); puts("");
		for(int i = 1; i <= n; i++){
			for(int j = 0; j < G[i].size(); j++){
				pt(G[i][j] * k);
				j==G[i].size()-1 ? putchar('\n'):putchar(' ');
			}
		}
	}
    return 0;
}
时间: 2024-10-15 14:47:51

Codeforces 476D Dreamoon and Sets 规律+构造的相关文章

Codeforces Round #272 (Div. 2) D.Dreamoon and Sets 找规律

D. Dreamoon and Sets Dreamoon likes to play with sets, integers and .  is defined as the largest positive integer that divides both a and b. Let S be a set of exactly four distinct integers greater than 0. Define S to be of rank k if and only if for

codeforces 848B - Rooter&#39;s Song(构造+几何)

原题链接:http://codeforces.com/problemset/problem/848/B 题意:好多个人分别从x,y轴不同位置不同时间往垂直坐标轴方向移动,一旦相遇他们转向,问所有人的到达边缘的位置. 思路:即使相遇后没有改变方向,终点位置还是不变的. 1.首先可以根据开始移动的时间将每个人的初始位置往后移动ti单位,这样就可以看作所有人都同时开始移动了. 2.接下来,假设两个人i,j在t时刻(x, y)处相撞,那么可以推知两个人的初始位置分别为(x-t, y),(x, y-t),

codeforces 459C - Pashmak and Buses 【构造题】

题目:codeforces 459C - Pashmak and Buses 题意:给出n个人,然后k辆车,d天时间,然后每天让n个人选择坐一辆车去上学,要去d天不能有任意两个人乘同一辆车,不能的话输出 -1 分类:数学,构造 分析:这个题目首先得分析,我开始想到的是首先用相同的放在一起,比如 7 2 3 这样构造 1 1 1 1 2 2 2 1 1 1 2 2 2 1 1 1 2 2 2 1 1 1 2 2 2 1 1 1 就是需要的天数跟每一行出现次数最多的数的出现次数相等,但是发现还有更优

Codeforces 12E Start of the season 构造 一个n*n矩阵使得每行恰好有一个[0,n-1]且对称

题目链接:点击打开链接 题意: 给定一个n 构造 一个n*n矩阵使得每行恰好有一个[0,n-1]且关于主对角线对称 且主对角线必须全为0 #include<stdio.h> #include<iostream> #include<string.h> #include<set> #include<vector> #include<map> #include<math.h> #include<queue> #inc

Codeforces Round #272 (Div. 2) D. Dreamoon and Sets (思维 数学 规律)

题目链接 题意: 1-m中,四个数凑成一组,满足任意2个数的gcd=k,求一个最小的m使得凑成n组解.并输出 分析: 直接粘一下两个很有意思的分析.. 分析1: 那我们就弄成每组数字都互质,然后全体乘以k不就行了么…… 然后看了看样例…… 这个该怎么说……我是觉得额这道题的output暴露了数据规律怎么破……我算是看出规律再证明的方式A的这道题 当时我看到22那个样例的时候……在想他干嘛要把22放这里……然后发现 2/4/6/10 14/16/18/22也是行的哇…… 化成乘以k之前的数据……

Codeforces Gym 100187K K. Perpetuum Mobile 构造

K. Perpetuum Mobile Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100187/problem/K Description The world famous scientist Innokentiy almost finished the creation of perpetuum mobile. Its main part is the energy generator whic

Codeforces 460D Little Victor and Set(构造)

题目链接:Codeforces 460D Little Victor and Set 题目大意:给定范围l,r,选小于k个数,使得这些数的亦或和最小. 解题思路:加入k为偶数,那么kXOR(k+1)=1 根据这个可以处理掉k≠3的所有情况. 对于k=3的情况,找到一个大于l的2k,如果满足2k+1≤r,那么就可以构造出三个数亦或值为0的情况. #include <cstdio> #include <cstring> #include <algorithm> using

codeforces 848A - From Y to Y(构造)

原题链接:http://codeforces.com/problemset/problem/848/A 题意:让我们构造一个字符串.这里有一种操作:取走这个字符串的若干部分,分成两部分,然后将这两部分的合并插回字符串中,进行过处理的字符串部分不能再次被单独取出,只能整体取出,直到无法操作后停止.每次这种操作后,消耗, f(s,c)是c字符在s字符串重复的次数. 让我们输出:若干次操作后最小值恰好为k的字符串,不用考虑字符的顺序. 思路:最好怎么简单怎么做.如果我们让字符串中只有一种字符,显然通过

Codeforces 610C:Harmony Analysis(构造)

[题目链接] http://codeforces.com/problemset/problem/610/C [题目大意] 构造出2^n个由1和-1组成的串使得其两两点积为0 [题解] 我们可以构造这样一个矩阵,右下角四分之一和其余三个分块相反, 不断扩展这个矩阵即可. [代码] #include <cstdio> #define rep(i,n) for(int i=1;i<=n;i++) using namespace std; const int N=1000; int k,p[N]