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{( ...
随机推荐
- 怎么删除STL容器的元素
在STL容器有顺序容器和关联容器两种. 顺序容器删除元素的方法有两种: 1.c.erase(p) 从c中删除迭代器p指定的元素.p必须指向c中一个真实元素,不能等于c.end().返回一个指向p之后元 ...
- 求数组前K个大的数
我们举例,假若从10000万个数里选出前100个最大的数据. 首先我们先分析:既然要选出前100个最大的数据,我们就建立一个大小为100的堆(建堆时就按找最大堆的规则建立,即每一个根节点都大于它的子女 ...
- 洛谷P4593 [TJOI2018]教科书般的亵渎
小豆喜欢玩游戏,现在他在玩一个游戏遇到这样的场面,每个怪的血量为\(a_i\),且每个怪物血量均不相同,小豆手里有无限张"亵渎".亵渎的效果是对所有的怪造成\(1\)点伤害,如果 ...
- [LeetCode] 926. Flip String to Monotone Increasing 翻转字符串到单调递增
A string of '0's and '1's is monotone increasing if it consists of some number of '0's (possibly 0), ...
- [LeetCode] 255. Verify Preorder Sequence in Binary Search Tree 验证二叉搜索树的先序序列
Given an array of numbers, verify whether it is the correct preorder traversal sequence of a binary ...
- [LeetCode] 190. Reverse Bits 颠倒二进制位
Reverse bits of a given 32 bits unsigned integer. Example 1: Input: 00000010100101000001111010011100 ...
- idea maven项目打包并部署到tomcat
打包 打开Maven管理器,邮寄package,执行Run Maven Build,执行成功后将war包生成到target目录下. 部署 1.将war包复制到tomcat安装目录下的webapps目录 ...
- 实验二 Java基础(数据/表达式、判定/循环语句)
实验二 (一)实验内容 编写简单的计算器,完成加减乘除模运算. 要求从键盘输入两个数,使用判定语句选择一种操作,计算结果后输出,然后使用判定和循环语句选择继续计算还是退出. 编写测试代码,测试验证. ...
- 第20课 unique_ptr独占型智能指针
一. unique_ptr的基本用法 (一)初始化方式 1. 直接初始化:unique<T> myPtr(new T); //ok.但不能通过隐式转换来构造,如unique<T&g ...
- 奥展项目笔记01--不同网站,点击工具--开发人员工具F12,显示的页面怎么不一样
开发人员工具F12,显示的页面不一样: 样式1: 样式2: 解决方案:兼容模式和极速模式的开发者工具不一样,改成极速模式就ok了.