【裴蜀定理】【CF1091C】 New Year and the Sphere Transmission
Description
有 \(n\) 个人围成一个圈,按照顺时针从 \(1\) 到 \(n\) 编号。第 \(1\) 个人会拿到一个球,他指定一个数字 \(k\),然后会将球传给他后面顺指针数第 \(k\) 个人。再次传到 \(1\) 后游戏结束。定义一次游戏的 \(ans\) 为所有拿到球的人的编号之和 (\(1\) 只算一次)。求所有可能的 \(ans\),按照升序输出,保证不超过 \(10^5\) 个
Input
一个整数 \(n\)
Output
一行多个整数,代表所有可能的 \(ans\)。按照是升序输出。
Hint
\(1~\leq~n~\leq~10^9\)
Solution
我们不妨将位置从 \(0~\sim~n-1\) 编号。则一个位置 \(p\) 会在一次传球中被传到当且仅当 \(p~\equiv~xk~\pmod n\),其中 \(x~\in~Z^+\)。
考虑上面的同余方程,他等价于 \(xk~+~yn~=~p\),其中 \(x,y~\in~Z^+\)。根据裴蜀定理,这个方程有整数解当且仅当 \(\gcd(k,n) \mid p\)。考虑因为 \(k~\in~[1,n]\),所以 \(\gcd(k,n)\) 显然与 \(n\) 的因数一一对应。于是直接枚举 \(n\) 的因数 \(s\),则对答案产生贡献的只有 \(0,s,2s,3s~\dots~ts\),其中 \(t~=~\frac{n}{s}\)。这是一个等差数列,直接使用等差数列求和公式可以 \(O(1)\) 计算答案。考虑我们位置是从 \(0~\sim~n-1\) 编号的,所以每个位置的贡献都少算了 \(1\),总共少算了 \(t\),最后加上 \(t\) 即可。另外因为编号最大的位置 \(ts\) 事实上就是 \(0\) 号位置,我们对这个位置的贡献算了两遍,减掉第二遍计算的贡献 \(n\) 即可。
Code
#include <cmath>
#include <cstdio>
#include <set>
#ifdef ONLINE_JUDGE
#define freopen(a, b, c)
#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 n;
std::set<ll>ss;
void work(cl);
int main() {
freopen("1.in", "r", stdin);
qr(n);
for (rg int i = 1, sn = sqrt(n); i <= sn; ++i) if (!(n % i)) {
work(i);
work(n / i);
}
for (std::set<ll>::iterator it = ss.begin(); it != ss.end(); ++it) qw(*it, ' ', true);
putchar('\n');
return 0;
}
void work(cl s) {
ll y = n / s;
ll ans = (((s + y * s) * y) >> 1) + y - n;
ss.insert(ans);
}
【裴蜀定理】【CF1091C】 New Year and the Sphere Transmission的更多相关文章
- 【BZOJ-2299】向量 裴蜀定理 + 最大公约数
2299: [HAOI2011]向量 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1118 Solved: 488[Submit][Status] ...
- 【BZOJ-1441】Min 裴蜀定理 + 最大公约数
1441: Min Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 471 Solved: 314[Submit][Status][Discuss] De ...
- BZOJ-2257 瓶子和燃料 分解因数+数论方面乱搞(裴蜀定理)
一开始真没想出解法...后来发现那么水.... 2257: [Jsoi2009]瓶子和燃料 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 970 So ...
- 【BZOJ】1441: Min(裴蜀定理)
http://www.lydsy.com/JudgeOnline/problem.php?id=1441 这东西竟然还有个名词叫裴蜀定理................ 裸题不说....<初等数 ...
- BZOJ 2257: [Jsoi2009]瓶子和燃料 裴蜀定理
2257: [Jsoi2009]瓶子和燃料 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/p ...
- BZOJ 2257: [Jsoi2009]瓶子和燃料【数论:裴蜀定理】
2257: [Jsoi2009]瓶子和燃料 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1326 Solved: 815[Submit][Stat ...
- 【Wannafly挑战赛22A计数器】【裴蜀定理】
https://www.nowcoder.com/acm/contest/160/A 题目描述 有一个计数器,计数器的初始值为0,每次操作你可以把计数器的值加上a1,a2,...,an中的任意一个整数 ...
- [BZOJ 2299][HAOI 2011]向量 题解(裴蜀定理)
[BZOJ 2299][HAOI 2011]向量 Description 给你一对数a,b,你可以任意使用(a,b), (a,-b), (-a,b), (-a,-b), (b,a), (b,-a), ...
- hdu 6444 网络赛 Neko's loop(单调队列 + 裴蜀定理)题解
题意:有编号为0~n-1的n个游戏,每个活动都有一个价值(可为负),给你m,s和k,你可以从任意一个编号开始玩,但是下一个游戏必须是编号为(i + k)%n的游戏,你最多能玩m次游戏,问你如果最后你手 ...
随机推荐
- Redis勒索事件爆发,如何避免从删库到跑路?
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯云数据库 TencentDB发表于云+社区专栏 9月10日下午,又一起规模化利用Redis未授权访问漏洞攻击数据库的事件发生,此次 ...
- ACM中常见错误提示解析
Output Limit Exceeded 多数发生在递归遍历的过程中,多输出了一些内容(比如说空格).Output Limit Exceeded还指如果输入某一组数据,你的程序返回的结果是一直输出某 ...
- 02-matplotlib-散点图
import numpy as np import matplotlib.pyplot as plt ''' 散点图显示两组数据的值,每个点的坐标位置的值决定 用户观察两种变量的相关性: 正相关 负相 ...
- windows 无法链接 \\ , 拼写错误或者网络有问题,解决方法
1. 楼主首先在网上搜索了一遍问题, 比较全面的回答链接如下http://blog.csdn.net/newizan/article/details/50313137 然而并没有解决问题, 于是反思了 ...
- Notes of Daily Scrum Meeting(11.4)
Notes of Daily Scrum Meeting 2014年11月4日 星期二 20:30—21:00 团队成员 今日团队任务 当日工作分配额 完成情况 陈少杰 阅读理解代码中底层与数据库 ...
- 使用java开发微信公众平台(1)
目录 开发服务器 域名验证 获取access_token 自定义菜单 个人账号不能定义url访问服务器,使用测试号就不用认证添加url了,进入公众平台测试账号 开发服务器 域名验证 进入公众平台测试账 ...
- Node.js记录
在智能社上听了一些关于node.js的视频,总结一小部分内容,都是总结老师讲的知识点,并且也是在不断学习的过程,所以会不断更新.也是为了怕自己遗忘一些知识点,同时现今没有什么项目可以让我去真正实践,这 ...
- 28_数据库_第28天(数据库、表及表数据、SQL语句)_讲义
今日内容介绍 1.MySQL数据库 2.SQL语句 01数据库概念 A: 什么是数据库 数据库就是存储数据的仓库,其本质是一个文件系统,数据按照特定的格式将数据存储起来, 用户可以对数据库中的数据进行 ...
- 18_集合框架_第18天_集合、Iterator迭代器、增强for循环 、泛型_讲义
今日内容介绍 1.集合 2.Iterator迭代器 3.增强for循环 4.泛型 01集合使用的回顾 *A:集合使用的回顾 *a.ArrayList集合存储5个int类型元素 public stati ...
- WebDriver 工作原理
WebDriver是W3C的一个标准,由Selenium主持. 具体的协议标准可以从http://code.google.com/p/selenium/wiki/JsonWireProtocol#Co ...