博客
关于我
Idiot 的乘幂
阅读量:325 次
发布时间:2019-03-04

本文共 1499 字,大约阅读时间需要 4 分钟。

I d i o t 的 乘 幂 Idiot 的乘幂 Idiot

题目链接:

题目大意

已知 a a a b b b c c c d d d p p p

在这里插入图片描述

样例输入

1022 1 3 17 246 12 5 6 1316 16 9 1 1911 1 14 2 238 4 17 15 1910 3 9 1 1311 1 2 2 2313 2 14 12 1711 9 7 11 1415 10 7 7 17

样例输出

17251614318No Solution!1112

数据范围

在这里插入图片描述

思路

这道题是一道数学题。

(一脸懵逼的我只知道怎么做,不知道为什么)
斐蜀定理 a x + b y = 1 ax+by = 1 ax+by=1然后求 x x x y y y,然后就得出: X ≡ X X≡X XXax+cy ≡ b x c y ≡b^xc^y bxcy
然后用扩欧一波神奇操作可以求出 x x x y y y。(不要问我为什么,我推不出来)
如果 x x x或者 y y y是负数,要用逆元把它转成正数(因为我们要快速幂)
然后根据上面的式子 X ≡ b x c y X≡b^xc^y Xbxcy,把 x x x y y y带进去,就可以求出 X X X
不过要带进去验证一下(题目的方程),如果都成立就是答案,否则没有答案。

代码

#include
#define ll long longusing namespace std;ll t, a, b, c, d, p, x, y;ll kuoou(ll a, ll b, ll &x, ll &y) { //扩欧 if (b == 0) { x = 1; y = 0; return a; } ll answ = kuoou(b, a % b, y, x); y -= a / b * x; return answ;}ll ksm(ll a, ll b, ll p) { //快速幂 ll an = 1; while (b) { if (b & 1) an = (an * a + p) % p; a = (a * a + p) % p; b >>= 1; } return an;}int main() { scanf("%lld", &t);//读入 for (ll i = 1; i <= t; i++) { scanf("%lld %lld %lld %lld %lld", &a, &b, &c, &d, &p);//读入 ll bb = b, dd = d, temp = 0;//初始化 kuoou(a, c, x, y);//求出 if (x < 0) { //x为负数 kuoou(b, p, bb, temp); x = -x; } if (y < 0) { //y为负数 kuoou(d, p, dd, temp); y = -y; } ll ans = ksm((bb % p + p) % p, x, p) * ksm((dd % p + p) % p, y, p) % p;//求出答案X if ((ksm(ans, a, p) == b % p) && (ksm(ans, c, p) == d % p))//验证 printf("%lld\n", ans);//有答案 else printf("No Solution!\n");//没有答案 } return 0; }

转载地址:http://doph.baihongyu.com/

你可能感兴趣的文章
WMWare下安装centOS7,并使用xshell进行连接记录.
查看>>
linux下同一个动态库名为何辣么多的.so文件
查看>>
SQL联表的方式(逗号, Left Join, Right Join)
查看>>
牛客网输入输出举例
查看>>
字符串初始化时的注意点
查看>>
dll路径加载顺序
查看>>
悬垂指针和野指针的区别
查看>>
软考相关试题
查看>>
顺序表的操作
查看>>
常量表达式
查看>>
POD类型
查看>>
安装HDF5及在VS下配置HDF5
查看>>
const与常量,傻傻分不清楚~
查看>>
图解哈希表及其原理
查看>>
Head First设计模式——迭代器模式
查看>>
Head First设计模式——中介者模式和备忘录模式
查看>>
MySQL数据库的两种连接方式:TCP/IP和Socket
查看>>
MongoDB版本及存储引擎区别
查看>>
shell echo单行和多行文字定向写入到文件中
查看>>
解析树状数组
查看>>