小Y喜欢研究数论,并且喜欢提一些奇怪的问题。
这天他找了三个两两互质的数a, b, c,以及另一个数m, 现在他希望找到三个(0, m)范围内的整数x, y, z,使得
 (xa+yb) Mod m=(zc) Mod m

Input
第一行一个数代表数据组数T
接下来T行每行四个整数m, a, b, c
满足a, b, c两两互质
1 <= T <= 100000
1 <= a, b, c <= 10^9
3 <= m <= 10^9
Output
对于每组数据,如果不存在x, y, z满足条件,则输出"Stupid xiaoy"(不含引号)
否则输出一行三个数分别为x, y, z
Input示例
1
100 1 1 1
Output示例
1 2 3

思路:
考虑构造形如2^kab+2^kab=2^(kab+1)的式子
那么只要找到合理的k使得(kab + 1)能被c整除,就可以构造出满足条件的x y z



kab+1=lc

那么有

lc−kab=1

可以用扩展欧几里得解这个不定方程

此时存在的唯一问题是,若m是2的次幂,那么取模之后结果可能是0
这种情况可以特殊处理,例如:
若a > 1,取x = m / 2, y = z = 1
b > 1类似
否则若c > 1, 取x = y = z = m / 2
否则取x = y = 1, z = 2

 1 #include <stdio.h>
2 #include<string.h>
3 #include<stdlib.h>
4 #include<math.h>
5 #include<algorithm>
6 #include<iostream>
7 using namespace std;
8 typedef long long LL;
9 pair<LL,LL>exgcd(LL n,LL m);
10 LL quick(LL n,LL m,LL mod);
11 int main(void)
12 {
13 LL m,a,b,c;
14 LL x,y,z;
15 int T;
16 scanf("%d",&T);
17 while(T--)
18 {scanf("%lld %lld %lld %lld",&m,&a,&b,&c);
19 if(m&(m-1))
20 {
21 pair<LL,LL>ask = exgcd(c,a*b);
22 ask.second = -ask.second;
23 while(ask.first<0||ask.second<0)
24 {
25 ask.first+=a*b;
26 ask.second+=c;
27 }
28 x = quick((LL)2,ask.second*b,m);
29 y = quick((LL)2,ask.second*a,m);
30 z = quick((LL)2,ask.first,m);
31 }
32 else
33 { //printf("1\n");
34 if(a > 1)
35 {
36 x = m/2;
37 y = 1;
38 z = 1;
39 }
40 else if(b>1)
41 {
42 x = 1;
43 y = m/2;
44 z = 1;
45 }
46 else if(c > 1)
47 {
48 x = m/2;
49 y = m/2;
50 z = m/2;
51 }
52 else
53 {
54 x = 1;
55 y = 1;
56 z = 2;
57 }
58 }
59 printf("%lld %lld %lld\n",x,y,z);}
60 return 0;
61 }
62 pair<LL,LL>exgcd(LL n,LL m)
63 {
64 if(m==0)
65 return make_pair(1,0);
66 else
67 {
68 pair<LL,LL>ak = exgcd(m,n%m);
69 return make_pair(ak.second,ak.first-(n/m)*ak.second);
70 }
71 }
72 LL quick(LL n,LL m,LL mod)
73 {
74 LL ask = 1;
75 while(m)
76 {
77 if(m&1)
78 ask = ask*n%mod;
79 n = n*n%mod;
80 m/=2;
81 }
82 return ask;
83 }

代码库

												

1479 小Y的数论题的更多相关文章

  1. 51nod 1479 小Y的数论题

    一脸不可做题~~~233333 T<=100000,所以一定要logn出解啦. 但是完全没有头绪*&#……%*&……()……#¥*#@ 题解: 因为2^p+2^p=2^(p+1) ...

  2. C - 小Y上学记——认识新同学

    C - 小Y上学记——认识新同学 Time Limit: 4000/2000MS (Java/Others)    Memory Limit: 128000/64000KB (Java/Others) ...

  3. 【luogu P4007 清华集训2017】小Y和恐怖奴隶主

    题目背景 “A fight? Count me in!” 要打架了,算我一个. “Everyone, get in here!” 所有人,都过来! 题目描述 小 Y 是一个喜欢玩游戏的 OIer.一天 ...

  4. 【luogu P4005 清华集训2017】小Y和地铁

    题目描述 小 Y 是一个爱好旅行的 OIer.一天,她来到了一个新的城市.由于不熟悉那里的交通系统,她选择了坐地铁. 她发现每条地铁线路可以看成平面上的一条曲线,不同线路的交点处一定会设有 换乘站 . ...

  5. 【UOJ#340】【清华集训2017】小 Y 和恐怖的奴隶主(矩阵快速幂,动态规划)

    [UOJ#340][清华集训2017]小 Y 和恐怖的奴隶主(矩阵快速幂,动态规划) 题面 UOJ 洛谷 题解 考虑如何暴力\(dp\). 设\(f[i][a][b][c]\)表示当前到了第\(i\) ...

  6. LOJ #6089. 小 Y 的背包计数问题

    LOJ #6089. 小 Y 的背包计数问题 神仙题啊orz. 首先把数分成\(<=\sqrt n\)的和\(>\sqrt n\)的两部分. \(>\sqrt n\)的部分因为最多选 ...

  7. 【LOJ6089】小Y的背包计数问题(动态规划)

    [LOJ6089]小Y的背包计数问题(动态规划) 题面 LOJ 题解 神仙题啊. 我们分开考虑不同的物品,按照编号与\(\sqrt n\)的关系分类. 第一类:\(i\le \sqrt n\) 即需要 ...

  8. 【LG4317】花神的数论题

    [LG4317]花神的数论题 题面 洛谷 题解 设\(f_{i,up,tmp,d}\)表示当前在第\(i\)位,是否卡上界,有\(tmp\)个一,目标是几个一的方案数 最后将所有\(d\)固定,套数位 ...

  9. P4005 小 Y 和地铁

    题目描述 小 Y 是一个爱好旅行的 OIer.一天,她来到了一个新的城市.由于不熟悉那里的交通系统,她选择了坐地铁. 她发现每条地铁线路可以看成平面上的一条曲线,不同线路的交点处一定会设有 换乘站 . ...

随机推荐

  1. SQL-用到的数据库语句总结

    0.SELECT * FROM  CHARACTER_SETS LIMIT 0,10   #从CHARACTER_SETS表中,从第1行开始,提取10行[包含第1行] 1.SELECT * FROM  ...

  2. 非标准的xml解析器的C++实现:一、思考基本数据结构的设计

    前言: 我在C++项目中使用xml作为本地简易数据管理,到目前为止有5年时间了,从最初的全文搜索标签首尾,直到目前项目中实际运用的类库细致到已经基本符合w3c标准,我一共写过3次解析器,我自己并没有多 ...

  3. A Child's History of England.4

    Still, the Britons would not yield. They rose again and again, and died by thousands, sword in hand. ...

  4. Node.js 概述

    JavaScript 标准参考教程(alpha) 草稿二:Node.js Node.js 概述 GitHub TOP Node.js 概述 来自<JavaScript 标准参考教程(alpha) ...

  5. HelloWorldDynamic

    package mbeanTest; import java.lang.reflect.Method; import javax.management.Attribute; import javax. ...

  6. java职业路线图

  7. springboot+vue脚手架使用nginx前后端分离

    1.vue配置 /** * * 相对于该配置的nginx服务器请参考nginx配置文件 * */ module.exports = { // 基本路径 publicPath: '/', // 输出文件 ...

  8. 【力扣】454. 四数相加 II

    给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) ,使得 A[i] + B[j] + C[k] + D[l] = 0. 为了使问题简单化,所有的 A ...

  9. 【力扣】146. LRU缓存机制

    运用你所掌握的数据结构,设计和实现一个  LRU (最近最少使用) 缓存机制.它应该支持以下操作: 获取数据 get 和 写入数据 put . 获取数据 get(key) - 如果关键字 (key) ...

  10. 深入浅出 Docker

    一.什么Docker 从作用的角度: Docker是一个为开发人员和系统管理员开发.迁移和运行应用程序的平台.应用程序通过Docker打包成Docker Image后,可以实现统一的方式来下载.启动. ...