51nod 1804 小C的多边形(构造)

首先可以算出无解的充分不必要条件,所有边的和为sum=3*((n-1)*n)/2,如果sum%n!=0显然无解。

也就是说n为奇数必然无解。现在考虑n为偶数的情况。

不妨假设n为偶数有解,现在考虑如何将这个解构造出来。

设此时n边形的为2*k+1,那么也就说,内边的每相邻两个边的和要为{k+2....3*k+2}

把边构造成这个样子即可。

k+1 1 k+2 2 k+3......2*k+1.

另外这个oj的读入效率真是感人肺腑啊。。。

# include <cstdio>
# include <cstring>
# include <cstdlib>
# include <iostream>
# include <vector>
# include <queue>
# include <stack>
# include <map>
# include <bitset>
# include <set>
# include <cmath>
# include <algorithm>
using namespace std;
# define lowbit(x) ((x)&(-x))
# define pi acos(-1.0)
# define eps 1e-8
# define MOD 1000000007
# define INF 1000000000
# define mem(a,b) memset(a,b,sizeof(a))
# define FOR(i,a,n) for(int i=a; i<=n; ++i)
# define FO(i,a,n) for(int i=a; i<n; ++i)
# define bug puts("H");
# define lch p<<1,l,mid
# define rch p<<1|1,mid+1,r
# define mp make_pair
# define pb push_back
typedef pair<int,int> PII;
typedef vector<int> VI;
# pragma comment(linker, "/STACK:1024000000,1024000000")
typedef long long LL;
inline int Scan() {
    int x=0,f=1;char ch=getchar();
    while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
    while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();}
    return x*f;
}
inline void Out(int a) {
    if(a<0) {putchar(‘-‘); a=-a;}
    if(a>=10) Out(a/10);
    putchar(a%10+‘0‘);
}
const int N=105;
//Code begin...

int main ()
{
    int n;
    scanf("%d",&n);
    if (n&1) {puts("0"); return 0;}
    int k=(n-1)/2;
    for (int i=n-1; i>=1; --i) Out(i), putchar(‘ ‘);
    putchar(‘\n‘);
    for (int i=k+1; i<2*k+1; ++i) Out(i), putchar(‘ ‘), Out(i-k), putchar(‘ ‘);
    Out(2*k+1); putchar(‘\n‘);
    return 0;
}

mycode

时间: 2024-08-05 04:05:07

51nod 1804 小C的多边形(构造)的相关文章

1804 小C的多边形

1804 小C的多边形 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 小C偶然发现了一个奇妙的n个点的多边形.现在你需要给外圈的边标记上1~n-1,里圈的边也标记上1~n-1,使得对于一个外圈相邻点与中间点构成的三角形的边权之和都相等. 图中带三角形的三个点构成的三角形的边权都要相等. 你需要输出一种标记方案.(如果不存在就输出0) Input 一共一行. 第一行,有一个n(4<=n<=1,000,000). Output 第一行n-1个数表示顺时针方向外

CodeForces 22C System Administrator 小水怡情 图论+构造

题目链接:点击打开链接 构造一个星形图+一个完全图就好了.. #include <cstdio> #include <cstring> #include <algorithm> #include <vector> #include <iostream> #include <map> #include <set> #include <math.h> using namespace std; #define inf

51nod 1631 小鲨鱼在51nod小学

基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 鲨鱼巨巨2.0(以下简称小鲨鱼)以优异的成绩考入了51nod小学.并依靠算法方面的特长,在班里担任了许多职务. 每一个职务都有一个起始时间A和结束时间B,意为小鲨鱼在[A, B]时间内,担任了某职务(inclusively). 现在给定小鲨鱼的职务履历表,你可以高效的给出小鲨鱼在某天担任了哪些职务吗? p.s. 由于小鲨鱼担任的职务太多,所有任期小于一个自然月的职务都忽略不计.(如1月1日~2月1日为一个自然月,

51nod 1471 小S的兴趣 sqrt

小S喜欢有趣的事.但是,每个人的兴趣都是独特的.小S热衷于自问自答.有一天,小S想出了一个问题. 有一个包含n个正整数的数组a和针对这个数组的几个问题.这些问题有两种类型: 1.      在数组下标l到r的部分上,将一个单元格循环移动到右端.即以下面方式重新分配数组上的元素. a[l], a[l+1], ..., a[r-1], a[r] → a[r], a[l], a[l+1], ..., a[r-1]. 2.      在数组下标l到r的部分上,计算有多少元素的值与k相等. 小S很喜欢这个

51nod 1831 小C的游戏

小C和小L是好朋友,她们在玩一个游戏. 一开始有一个大小为n的石子堆,小C先手. 每次可以对这个石子堆拿走一个或者把这个石子堆分成等量的几份并只取其中一份(不能不变或只剩下一个). 如果取走最后一个人的算败,请问这个游戏小C是否能胜. Input一行表示数据组数Tcases(Tcases<=1,000). 后面Tcases行每行一个n(n<=1,000,000,000).Output有Tcases行对于先手获胜输出“TAK”,先手狗带输出“NIE”.Sample Input 1 5 Sampl

51nod 2485 小b重排字符串

小b有一个字符串S,现在她希望重排列S,使得S中相邻字符不同. 请你判断小b是否可能成功. 样例解释:将"aab"重排为"aba"即可. 收起 输入 输入一个只包含小写字母的字符串S,其长度n满足1≤n≤500 输出 如果可能,输出"Possible": 否则,输出"Impossible". 输入样例 aab 输出样例 Possible 只要同一种字母不超过总数的一半即可,保证能交叉放开.代码: #include <io

51nod 1643 小Q的家庭作业

题意: f(n) = sigma(gcd(i,n))  1 <= i <= n g(n) = sigma(f(d))    d | n n = x1 * x2 * ... * xm 其中 x[i+1] = (a * x[i] + b) % c + 1 1 <= m <= 10^18 1 <= c <= 10^7 1 <= x[1],a,b  <= c 首先,发现f,g函数都是积性函数 并且推下公式:g[n] = n * (k1 + 1 ) * (k2 + 1

51nod 1831 小C的游戏(博弈论+打表)

比较坑的题目. 题意就是:给出一堆石子,一次操作可以变成它的约数个,也可以拿只拿一个,不能变成一个,最后拿的人输. 经过打表发现 几乎所有质数都是先手必败的,几乎所有合数都是先手必胜的 只有几个例外,就是17^n, 2^n这些. 不过继续推导可以发现16是先手必败的,因为2,4,8,15都是先手必胜的 所以2^n(n>4)都是先手必胜的 17是先手必胜的,所以17^2是先手必败的,17^n(n>2)是先手必胜的 17*2是先手必败的 同理可以推导出2^n*17^m这些(当n>1或m>

51nod——2476 小b和序列 预处理

对于每一个元素,预处理出它作为最小值,两边可以作用到的最大位置.比如下标∈[0,8]的这个数组:1 8 6 2 5 4 3 8 7,1可以作用到所有区间,2可以作用到区间[1,8],第一个8可以作用到[1,7].也就是说从两边分别找到第一个大于等于这个元素的位置,然后标记,其实就是找最宽的区间长度.可能左边更宽也可能右边更宽,对所有元素的max(a[i]*(i-l[i])),a[i]*(r[i]-i)) 求max就是答案了. 1 #include <bits/stdc++.h> 2 using