[ARC145D] Non Arithmetic Progression Set
Problem Statement
Construct a set $S$ of integers satisfying all of the conditions below. It can be proved that at least one such set $S$ exists under the Constraints of this problem.
- $S$ has exactly $N$ elements.
- The element of $S$ are distinct integers between $-10^7$ and $10^7$ (inclusive).
- $ \displaystyle \sum _{s \in S} s = M$.
- $ y-x\neq z-y$ for every triple $ x,y,z$ $(x < y < z)$ of distinct elements in $ S$.
Constraints
- $1 \leq N \leq 10^4$
- $|M| \leq N\times 10^6$
- All values in input are integers.
Input
Input is given from Standard Input in the following format:
$N$ $M$
Output
Let $s_1,s_2,\ldots,s_N$ be the elements of $S$. Print a set $S$ that satisfies the conditions in the following format:
$s_1$ $s_2$ $\ldots$ $s_N$
If multiple solutions exist, any of them will be accepted.
Sample Input 1
3 9
Sample Output 1
1 2 6
We have $2-1 \neq 6-2$ and $1+2+6=9$, so this output satisfies the conditions. Many other solutions exist.
Sample Input 2
5 -15
Sample Output 2
-15 -5 0 2 3
$M$ may be negative.
存在等差数列,当且仅当存在三个数$x,y,z$,使得 $y-x=z-y$
移一下项,得到 \(2y=z+x\)
考虑一个数的三进制。如果集合中所有数的三进制表示下只有 \(0\) 和\(1\),那么 \(2y\) 的三进制表示下只由 \(0\) 和 \(2\) 组成。若要选出 \(x+z=2y\) ,当且仅当 \(x=z=y\),而集合有不可重性。所以如果这样构造,可以得出答案。易得构造出的数在 \([-10^7,10^7]\) 内(见附注)。
但是我们要保证所有数和为m。容易发现,如果一个集合 \(s\) 是合法的,那么给 \(s\) 中每一个数同时加上一个数,集合仍然没有等差数列。所以如果构造出序列后,我们先想办法让他们的和与 \(m\) 模 \(n\) 同余,然后再给每个数加上 \(\frac{(m-sum(s))}{n}\)即可。如何微调集合使得他们的和模 \(n\) 同余呢?在枚举三进制时,我们可以空出最后一位,然后微调。
上面就是大概思路,我们用样例详解
\(n=5,m=-15\)
首先构造有5个数的合法集合
\((0010)_3=3\)
\((0100)_3=9\)
\((0110)_3=12\)
\((1000)_3=27\)
\((1010)_3=30\)
和为 \(3+9+12+27+30=81\),模 \(5\) 余 \(1\)。\(m\) 模 \(5\) 余 \(0\)。
所以我们要选择 \(4\) 个数加 \(1\)。集合变成了:
\((0011)_3=4\)
\((0101)_3=10\)
\((0111)_3=13\)
\((1001)_3=28\)
\((1010)_3=30\)
那么我们再给每个数减去 \((85-(-15))/5=20\)。集合就是
$ {-16,-10,-7,8,10}$
代码就很好写了。
建议枚举初始合法三进制时用二进制枚举。
#include<bits/stdc++.h>
const int N=10005;
int n,s[N],ret;
long long m,x,sum,d;
int main()
{
scanf("%d%lld",&n,&m);
for(int i=2;i<=2*n;i+=2)
{
ret=3;
for(int j=1;j<15;j++)
{
if(i>>j&1)
s[i>>1]+=ret;
ret*=3;
}
sum+=s[i>>1];
}
x=((m-sum)%n+n)%n;
d=floor((1.00*m-sum)/n);
for(int i=1;i<=x;i++)
s[i]++;
for(int i=1;i<=n;i++)
printf("%lld ",s[i]+d);
}
[ARC145D] Non Arithmetic Progression Set的更多相关文章
- CF 1114 E. Arithmetic Progression
E. Arithmetic Progression 链接 题意: 交互题. 有一个等差序列,现已打乱顺序,最多询问60次来确定首项和公差.每次可以询问是否有严格大于x的数,和查看一个位置的数. 分析: ...
- POJ3495 Bitwise XOR of Arithmetic Progression
Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 772 Accepted: 175 Description Write ...
- Dirichlet's Theorem on Arithmetic Progression
poj3006 Dirichlet's Theorem on Arithmetic Progressions 很显然这是一题有关于素数的题目. 注意数据的范围,爆搜超时无误. 这里要用到筛选法求素数. ...
- Find Missing Term in Arithmetic Progression 等差数列缺失项
查找等差数列中的缺失项. e.g.Input: arr[] = {2, 4, 8, 10, 12, 14} Output: 6 Input: arr[] = {1, 6, 11, 16, 21, 31 ...
- BestCoder22 1002.NPY and arithmetic progression(hdu 5143) 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5143 题目意思:给出 1, 2, 3, 4 的数量,分别为a1, a2, a3, a4,问是否在每个数 ...
- codeforces C. Arithmetic Progression 解题报告
题目链接:http://codeforces.com/problemset/problem/382/C 题目意思:给定一个序列,问是否可以通过只插入一个数来使得整个序列成为等差数列,求出总共有多少可能 ...
- cf C. Arithmetic Progression
http://codeforces.com/contest/382/problem/C 题意:给你n个数,然后让你添加一个数使得n+1个数能形成这样的规律,a[1]-a[0]=a[2]-a[1]=a[ ...
- CF1114E Arithmetic Progression(交互题,二分,随机算法)
既然是在CF上AC的第一道交互题,而且正是这场比赛让我升紫了,所以十分值得纪念. 题目链接:CF原网 题目大意:交互题. 有一个长度为 $n$ 的序列 $a$,保证它从小到大排序后是个等差数列.你不知 ...
- Codeforces 1114E - Arithmetic Progression - [二分+随机数]
题目链接:http://codeforces.com/problemset/problem/1114/E 题意: 交互题,有一个 $n$ 个整数的打乱顺序后的等差数列 $a[1 \sim n]$,保证 ...
- HDU 5143 NPY and arithmetic progression(思维)
http://acm.hdu.edu.cn/showproblem.php?pid=5143 题意: 给定数字1,2,3,4.的个数每个数字能且仅能使用一次,组成多个或一个等差数列(长度大于等于3), ...
随机推荐
- tailwindcss -原子化 CSS 框架
原子化 CSS 框架 我记得很久之前有时候为了少写些css,我们通常会有如下的样板代码 .block { display: block; } .flex { display:flex } .flex- ...
- Python 基础面试第四弹
1. Python中常用的库有哪些,作用分别是什么 requests: requests 是一个用于发送 HTTP 请求的库,它提供了简单而优雅的 API,可以轻松地发送 GET.POST.PUT.D ...
- 千万级数据的表,我把慢sql优化后性能提升30倍!
分享技术,用心生活 背景:系统中有一个统计页面加载特别慢,前端设置的40s超时时间都加载不出来数据,因为是个统计页面,基本上一猜就知道是mysql的语句有问题,遗留了很久没有解决,正好趁不忙的时候,下 ...
- Blazor前后端框架Known-V1.2.14
V1.2.14 Known是基于C#和Blazor开发的前后端分离快速开发框架,开箱即用,跨平台,一处代码,多处运行. Gitee: https://gitee.com/known/Known Git ...
- 交叉编译 Qt5.12 armv8(aarch64) 带 WebEngine - NVIDIA JETSON TX2
编译平台 Windows10 WSL2 Debian,目标平台 NVIDIA JETSON TX2 (注:Ubuntu <= 16.04 会出现 libclang < 3.8 的问题) 下 ...
- List取指定元素
例如: List<string> list = new List<string>(); list.Take(50).ToList();//取前50条 list.Skip(10) ...
- Solution Set -「ABC 205」
应该是最近最水的 ABC 了吧. 「ABC 205A」kcal Link. 略 #include <bits/stdc++.h> using ll = long long; #define ...
- 搞懂fflush(stdout)
使用 printf 或 cout 打印内容时,输出永远不会直接写入"屏幕".而是,被发送到 stdout. (stdout 就像一个缓冲区) 默认情况下,发送到 stdout 的输 ...
- c语言代码练习6
//输入三个数字,依次按照从大到小输出#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> int main() { int a = 0 ...
- 如何在linux(Ubuntu)下安装unity(Unity engine游戏引擎)
如果直接从unity官网下载unityhub的deb包,直接安装有可能出现unityhub打不开/打开缓慢/无法登陆/无法申请密钥等问题. 正解:从Unity官方源下载unity 1.先添加unity ...