Description

Tweetuzki 特别喜欢等差数列。尤其是公差为 \(1\) 且全为正整数的等差数列。

显然,对于每一个数 \(s\),都能找到一个对应的公差为 \(1\) 且全为正整数的等差数列各项之和为 \(s\)。这时,Tweetuzki 想知道,满足这样条件的等差数列,最小的首项是多少。

由于 Tweetuzki 的数学非常差,尤其是因式分解,所以请你告诉他结果。

Input

输入仅包含一行一个整数 \(s\)

Output

输出一行两个用空格隔开的整数代表首项和末项

Hint

对于 \(10\%\) 的数据,\(1~\leq~s~\leq~10^6\)。

对于 \(100\%\) 的数据,\(1~\leq~s~\leq~10^{12}\)

Solution

考虑前 \(10\%\) 的点,暴力枚举首项,枚举完首项就可以 \(O(1)\) 判断是否合法了。期望得分 10 pts

考虑剩下的部分:

一个等差数列的长度只有为奇数和偶数两种可能,下面对这两种可能分类讨论:

对于长度为奇数的情况,设这个等差数列共有 \(2x~+~1\) 项,其中中项(最中间)为 \(a_k\)

因为 \(a_{k-i}~+~a_{k+i}~=~2~\times~a_k\),所以 \(\sum~a_i~=~(2x~+~1)~a_k~=~s\)

同理,对于长度为偶数的情况,设共有 \(2x\) 项,其中中间两项为 \(a_k~,~a_{k+1}\),因为公差为\(1\),所以即为 \(a_k~,~a_k~+~1\)

于是 \(\sum~a_i~=~x(a_k+a_k~+~1)~=~x~(2a_k~+~1)~=~s\)

由此我们得到了两种情况的关系式

\[s~=~\begin{cases}(2x~+~1)~a_k \\x~(2a_k~+~1) \end{cases}
\]

其中第一种情况长度为奇数,第二种情况长度为偶数。

注意到这两个式子都是 \(s\) 的因数分解,于是考虑直接枚举 \(x\) 的因数。

在第一种情况下,因为 \(a_k\) 是它的因数,我们考虑枚举 \(a_k\),只要枚举到第一个合法的 \(a_k\) 即可停止,

第二种情况下,因为 \(x\) 是它的因数,我们考虑枚举 \(x\),计算所有合法的 \(a_k\)

另外记得特判一个数是由自己做等差数列的情况

Code

#include <cmath>
#include <cstdio>
#include <algorithm>
#ifdef ONLINE_JUDGE
#define freopen(a, b, c)
#define putchar(o) \
puts("I am a cheater!")
#endif
#define rg register
#define ci const int
#define cl const long long typedef long long int ll; namespace IPT {
const int L = 1000000;
char buf[L], *front=buf, *end=buf;
char GetChar() {
if (front == end) {
end = buf + fread(front = buf, 1, L, stdin);
if (front == end) return -1;
}
return *(front++);
}
} template <typename T>
inline void qr(T &x) {
rg char ch = IPT::GetChar(), lst = ' ';
while ((ch > '9') || (ch < '0')) lst = ch, ch=IPT::GetChar();
while ((ch >= '0') && (ch <= '9')) x = (x << 1) + (x << 3) + (ch ^ 48), ch = IPT::GetChar();
if (lst == '-') x = -x;
} template <typename T>
inline void ReadDb(T &x) {
rg char ch = IPT::GetChar(), lst = ' ';
while ((ch > '9') || (ch < '0')) lst = ch, ch = IPT::GetChar();
while ((ch >= '0') && (ch <= '9')) x = x * 10 + (ch ^ 48), ch = IPT::GetChar();
if (ch == '.') {
ch = IPT::GetChar();
double base = 1;
while ((ch >= '0') && (ch <= '9')) x += (ch ^ 48) * ((base *= 0.1)), ch = IPT::GetChar();
}
if (lst == '-') x = -x;
} namespace OPT {
char buf[120];
} template <typename T>
inline void qw(T x, const char aft, const bool pt) {
if (x < 0) {x = -x, putchar('-');}
rg int top=0;
do {OPT::buf[++top] = x % 10 + '0';} while (x /= 10);
while (top) putchar(OPT::buf[top--]);
if (pt) putchar(aft);
} ll s, ans = 1000000000000ll, ss; int main() {
freopen("1.in", "r", stdin);
qr(s);
for (rg ll i = 2; (i * i) <= s; ++i) if(!(s % i)) { //枚举中项
ll k = s / i;
if (k & 1) {
ll x = k >> 1;
if ((i - x) > 0) {
ans = i - x;
ss = k;
break;
}
}
}
for (rg ll i = 1; (i * i) <= s; ++i) if (!(s % i)) { //枚举x
ll k = s / i;
if (k & 1) {
ll a = k >> 1;
if ((a - i) > 0) {
if (ans > a - i) ans = a - i + 1, ss = i << 1;
}
}
}
if (ans == 1000000000000ll) printf("%lld %lld\n", s, s);
else {
qw(ans, ' ', true);
qw(ans + ss - 1, '\n', true);
}
return 0;
}

【数学】【P5077】 Tweetuzki 爱等差数列的更多相关文章

  1. [luogu5077][Tweetuzki 爱等差数列]

    题目链接 思路 数学题 首先列出等差数列求和的式子. \[S = \frac{(n + m)(n - m + 1)}{2}(n为末项,m为首项)\] \[S * 2= (n + m)(n - m + ...

  2. 【数学】【P5076】 Tweetuzki 爱整除

    Description 对于一个数 \(k\),找到任意一个 \(x\),满足 \(0~\leq~k~\leq~x~\leq~10^{18}\) 且对于任意一个 \(x\) 进制数,把该数字各数位上的 ...

  3. 【DP】【P5080】 Tweetuzki 爱序列

    Description Tweetuzki 有一个长度为 \(n\) 的序列 \(a_1~,~a_2~,~\dots~,a_n\). 他希望找出一个最大的 \(k\),满足在原序列中存在一些数 \(b ...

  4. 【贪心】【P5078】Tweetuzki 爱军训

    Description Tweetuzki 所在的班级有 \(n\) 名学生,座号从 \(1\) 到 \(n\).有一次,教官命令班上的 \(n\) 名学生按照座号顺序从左到右排成一排站好军姿,其中 ...

  5. 洛谷 P5078 Tweetuzki 爱军训

    题目连接 很明显,1e6的范围,要么nlgn要么O(n) nlgn的话可能会想到借助一些数据结构,我并没有想到这种做法 对于这种题,O(n)的做法要么是线性递推,要么就应该是贪心了 考虑这道题我们怎么 ...

  6. 【hash】【P5079】P5079 Tweetuzki 爱伊图

    Description Input 第一行两个正整数 \(r~,~c\),表示矩阵的行数和列数. 接下来 \(r\) 行,每行输入 \(c\) 个字符,用空格隔开,保证只含有 . 和 # 两种字符.输 ...

  7. 「Luogu P5080 Tweetuzki 爱序列」

    题目大意 给出一些数,需要求出 \(\frac{a_{i+1}}{3}=a_i\) 或 \(a_{i+1}=2 \times a_i\) 时最长的序列 \(a\). 分析 可以发现符合条件的序列 \( ...

  8. 【剑指offer】和为S的连续整数序列

    找到所有和为S的连续整数序列,序列长度>=2 我的思路:数学法,限定首元素范围,计算序列长度. 书上解法:用small和big两个游标记录序列的开始和结束位置,调整游标. 我的解法: /* ​直 ...

  9. Python 正则表达式 flags 参数

    flags参数 re.I IGNORECASE 忽略字母大小写 re.L LOCALE 影响 “w, “W, “b, 和 “B,这取决于当前的本地化设置. re.M MULTILINE 使用本标志后, ...

随机推荐

  1. C#匿名参数(转载too)

    匿名方法是在初始化委托时内联声明的方法. 例如下面这两个例子: 不使用匿名方法的委托: using System; using System.Collections.Generic; using Sy ...

  2. 在GPT格式的硬盘上,使用EFI启动的方式,安装Win7 64位系统

    Win7 sp1 原装系统,用UltraISO(软碟通) 把U 盘制成Win7 安装的启动U盘 将bootmgfw.efi和shell.efi 加到已制好启动U盘的根目录,并在efi/boot/路径下 ...

  3. K-means + PCA + T-SNE 实现高维数据的聚类与可视化

    使用matlab完成高维数据的聚类与可视化 [idx,Centers]=kmeans(qy,) [COEFF,SCORE,latent] = pca(qy); SCORE = SCORE(:,:); ...

  4. c++ Dynamic Memory (part 1)

    1. make_shared<T>(args): return a shared_ptr dynamically allocated object of type T. Use args ...

  5. SVN服务器搭建及客户端配置

    为什么要使用SVN? 在程序的编写过程中,每个程序员都会负责开发一个或多个模块,且开发中会生成很多不同的版本, 这就需要程序员有效的管理代码,在需要的时候可以迅速,准确取出相应的版本. Subvers ...

  6. UML设计(团队作业6)

    决胜 Poker 一.团队成员 学号 姓名 211606392 郑俊瑜 (队长) 211606327 冉繁盛 211606323 刘世华 211606386 姚皓钰 211606358 陈卓楠 211 ...

  7. MOOK学习

    课程选择及其理由 课程:c++程序设计 教师:魏英 学校:西北工业大学 总共:48讲 选择理由:我其实之前找了好几个,但由于小白,思考了下(迷茫,感觉好像都不错),然后看了一下大家都选择了西北工业大学 ...

  8. HDU 5661 Claris and XOR 贪心

    题目链接: hdu:http://acm.hdu.edu.cn/showproblem.php?pid=5661 bc(中文):http://bestcoder.hdu.edu.cn/contests ...

  9. 关《我是IT小小鸟》有感

    我一直认为大学就是一个自由的舒适的学习环境,没有人可以干扰你限制你,以至于我到了大学之后只剩下了颓废的生活.每天上课玩手机,下课玩电脑,吃饭叫外卖,从不去锻炼,周末就熬夜通宵,状态越来越差,导致我逐渐 ...

  10. springmvc 路由

    工作中MVC是较常使用的web框架,作为研发人员,也习惯了以编写Controller作为项目开始,写好了Controller和对应的方法,加上@RequestMapping注解,我们也就认为一切已经准 ...