Comet OJ - Contest #10 C.鱼跃龙门
题意:
求最小的\(x\),满足\(\frac{x(x+1)}{2}\% n=0,n\leq 10^{12}\)。
多组数据,\(T\leq 100\)。
思路:
- 直接考虑模运算似乎涉及到二次剩余什么的,但比较复杂。
- 注意到比较特殊的就是,最后结果为\(0\),那么我们就考虑将问题转化为整除。
- 所以式子等价于\(n|\frac{x(x+1)}{2}\)即\(2n|x(x+1)\)。
- 注意到\(n\)的范围,那么我们能\((O\sqrt{n})\)来枚举\(p,q\),满足\(pq=2n\)。
- 那么就有\(pq|x(x+1)\),不妨设\(x=qb,x+1=pa\),那么就有\(pa-qb=1\),现在就相当于知道\(p,q\),求解最小的正数解\(a,b\)使得\(x\)最小。
- 显然这是经典的扩展欧几里得问题。
因为这个题卡常,所以我们将枚举改成枚举质因子,注意一下最后质因子分解的时候也要先把素数筛出来,不然也会T。
最后扩展欧几里得得到解的时候注意一下,我们可以选择正项或负项处理,我选择的是按负项处理直接得到答案。
(这点纠结了一会儿,就是处理的时候和位置无关,按正项处理不论处理哪一个都是第一项,负项处理不论哪一个都是第二项。)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 35, MAX = 1e6 + 5;
int T;
ll n;
bool chk[MAX];
int prime[MAX], tot;
void pre() {
for(int i = 2; i < MAX; i++) {
if(!chk[i]) {
chk[i] = 1;
prime[++tot] = i;
for(ll j = 1ll * i * i; j < MAX; j += i) {
chk[j] = 1;
}
}
}
}
void exgcd(ll a, ll b, ll &x, ll &y) {
if(b == 0) {
x = 1, y = 0;
return ;
}
exgcd(b,a%b,x,y);
ll z = x ;
x = y;
y = z - y * (a / b);
}
int cnt;
ll tmp[N];
ll calc(ll a, ll b) {
ll x, y;
exgcd(a, b, x, y);
y = (y % a + a) % a;
if(y * b >= 0) y -= a;
return -y * b;//按负项处理
}
ll dfs(int num, ll a, ll b) {
if(num > cnt) return calc(a, b);
return min(dfs(num + 1, a * tmp[num], b), dfs(num + 1, a, b * tmp[num]));
}
int main() {
ios::sync_with_stdio(false); cin.tie(0);
pre();
cin >> T;
while(T--) {
cin >> n;
n <<= 1;
cnt = 0;
for(int i = 1; i <= tot; i++) {
if(prime[i] > n) break;
if(n % prime[i] == 0) {
tmp[++cnt] = 1;
ll now = prime[i];
while(n % prime[i] == 0) {
tmp[cnt] *= now;
n /= prime[i];
}
}
}
if(n > 1) tmp[++cnt] = n;
ll ans = dfs(1, 1, 1);
cout << ans << '\n';
}
return 0;
}
Comet OJ - Contest #10 C.鱼跃龙门的更多相关文章
- Comet OJ - Contest #10 鱼跃龙门 exgcd+推导
考试的时候推出来了,但是忘了 $exgcd$ 咋求,成功爆蛋~ 这里给出一个求最小正整数解的模板: ll solve(ll A,ll B,ll C) { ll x,y,g,b,ans; gcd = e ...
- Comet OJ - Contest #10 C题 鱼跃龙门
###题目链接### 题目大意: 给你一个 x ,让你求出最小的正整数 n 使得 n * (n + 1) / 2 % x == 0 ,即 n * (n + 1) % 2x == 0 . 分析: 1 ...
- Comet OJ - Contest #10 B题 沉鱼落雁
###题目链接### 题目大意:有 n 个正整数,每个正整数代表一个成语,正整数一样则成语相同.同一个正整数最多只会出现 3 次. 求一种排列,使得这个排列中,相同成语的间隔最小值最大,输出这个最小间 ...
- Comet OJ - Contest #11 题解&赛后总结
Solution of Comet OJ - Contest #11 A.eon -Problem designed by Starria- 在模 10 意义下,答案变为最大数的最低位(即原数数位的最 ...
- Comet OJ - Contest #13 「火鼠的皮衣 -不焦躁的内心-」
来源:Comet OJ - Contest #13 芝士相关: 复平面在信息学奥赛中的应用[雾 其实是道 sb 题??? 发现原式貌似十分可二项式定理,然后发现确实如此 我们把 \(a^i\) 替换成 ...
- Comet OJ - Contest #13 「佛御石之钵 -不碎的意志-」(hard)
来源:Comet OJ - Contest #13 一眼并查集,然后发现这题 tmd 要卡常数的说卧槽... 发现这里又要用并查集跳过访问点,又要用并查集维护联通块,于是开俩并查集分别维护就好了 一开 ...
- Comet OJ - Contest #5
Comet OJ - Contest #5 总有一天,我会拿掉给\(dyj\)的小裙子的. A 显然 \(ans = min(cnt_1/3,cnt_4/2,cnt5)\) B 我们可以感性理解一下, ...
- Comet OJ Contest #13 D
Comet OJ Contest #13 D \(\displaystyle \sum_{i=0}^{\left\lfloor\frac{n}{2}\right\rfloor} a^{i} b^{n- ...
- Comet OJ - Contest #2 简要题解
Comet OJ - Contest #2 简要题解 cometoj A 模拟,复杂度是对数级的. code B 易知\(p\in[l,r]\),且最终的利润关于\(p\)的表达式为\(\frac{( ...
随机推荐
- Attention篇(一)
主要是阅读以下博文的总结: https://zhuanlan.zhihu.com/p/31547842 https://www.zhihu.com/question/68482809/answer/2 ...
- [LeetCode] 119. Pascal's Triangle II 杨辉三角之二
Given a non-negative index k where k ≤ 33, return the kth index row of the Pascal's triangle. Note t ...
- 【活动公告】Hackathon —— 腾讯云AI API接入迷你赛
一. 活动简介 编程马拉松(Hackathon)是将热爱软硬件开发的人聚集起来所举办的一项比赛,本次活动由腾讯云AI联合云+社区发起,希望让广大开发者体验到腾讯云AI的魅力.比赛过程中,参赛者可以尽情 ...
- c#中怎样取得某坐标点的颜色
// x,y 分别为x轴,y轴坐标 返回System.Drawing.Color 可以直接显示 public System.Drawing.Color GetPixelColor(int x, int ...
- W5500电路图
W5500是韩国一款集成全硬件 TCP/IP 协议栈的嵌入式以太网控制器,W5500同时也是一颗工业级以太网控制芯片,最近发现我们国内也有和W5500 芯片一样芯片 介绍给大家 如下图:
- 解决百度UEditor列出图片列出文件时返回的文件路径为磁盘绝对路径的问题
替换绝对路径为空 String str = new ActionEnter(request, buffer.toString(), "config.json").exec(); S ...
- Reflector调试dll功能
Reflector不仅仅是一个反编译工具,之前用Resharper,把这个给忽略了,这个Reflector还有一个调试dll功能, 在调试时反编译代码,会生成对应的pdb文件,就可以进行dll源码调试 ...
- Docker 部署ELK之Sentinl日志报警
前篇文章简单介绍了Docker 部署ELK,以及使用filebeat收集java日志.这篇我们介绍下日志报警配置,这里我们使用Sentinl插件. 1.修改kibana参数 进入elk容器,修改对应参 ...
- OCC与MVCC 的区别
一.前言 在数据库中,并发控制是指在多个用户/进程/线程同时对数据库进行操作时,如何保证事务的一致性和隔离性的,同时最大程度地并发. 当多个用户/进程/线程同时对数据库进行操作时,会出现3种冲突情形: ...
- mac下安装和运行redis
第一部分:安装 第一步:直接从官网下载**.tar.gz这个包.并用tar -zxvf **.tar.gz -C 指定目录 示例命令: tar -zxvf redis-5.0.5.tar.gz ...