Problem Description

要求(A/B)%9973,但由于A很大,我们只给出n(n=A%9973)(我们给定的A必能被B整除,且gcd(B,9973) = 1)。

Input

数据的第一行是一个T,表示有T组数据。每组数据有两个数n(0 <= n < 9973)和B(1 <= B <= 10^9)。

Output

对应每组数据输出(A/B)%9973。

Sample Input

2
1000 53
87 123456789

Sample Output

7922
6060

解题思路:这道题有三种做法,①是扩展欧几里德算法,②是试探算法,③是乘法逆元。

解法一:可以用解整数的不定方程来解决,即使用扩展欧几里德算法。

根据题意,输入的n=A%9973(没有输入A),A%B=0(A必能被B整除),B与9973互质(gcd(B,9973)=1)。
设x=(A/B)%9973(x是最终想计算的值),则9973k+x=A/B(k为整数:(A/B)/9973),得A=9973Bk+xB。
因为n=A%9973与A=9973Bk+xB,所以xB%9973=n,得xB=n+9973y。故:(x/n)B+(-y/n)9973=1=gcd(B,9973),该方程有解。要求x和y,先求X=x/n和Y=-y/n,即先解方程BX+9973Y=1。最后,x=X*n。需要注意的是,求得的x有可能是负值,需要调整为正数,即x=(x+a)%a。

顺便推导一下扩展欧几里得算法的计算过程:假设ax+by=gcd(a,b),由欧几里得算法可得gcd(a,b)=gcd(b,a%b),即ax+by=bx1+(a%b)y1=bx1+(a-a/b*b)y1=ay1+b(x1-a/b*y1),由恒等定理可得x=y1,y=x1-a/b*y1,这样我们就得到了求解x,y的方法:系数x,y基于x1,y1。终止条件:当b=0时,a为最大公约数。这时只需保证a的系数即x=1即可,y取任何值都不会由影响,因为此时b=0,所以我们不妨假设y=0,exgcd先递归到最后再回溯回来计算每个状态下的x',y',最终就可求得系数x,y的值。

AC代码:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int exGcd(int a,int b,int &x,int &y)//exgcd算法
  4. {
  5. if(b==){x=;y=;return a;}//ecgcd的终止状态为a=gcd,b=0
  6. int r=exGcd(b,a%b,x,y);//下一个状态:b*x1+(a%b)*y1=gcd(b,a%b),相当于欧几里得算法,先递归到b=0,然后返回每个状态下的公约数
  7. int t=x;x=y;y=t-a/b*y;//x=y',y=x'-a/b*y'
  8. return r;//返回当前的公约数给上一个状态
  9. }
  10. int main()
  11. {
  12. int t,n,b,x,y,a=;//a为质数
  13. cin>>t;
  14. while(t--){
  15. cin>>n>>b;
  16. exGcd(b,a,x,y);//方程:bx+ay=gcd(b,a)=1
  17. //if(x<0)x+=a;
  18. x=(x+a)%a;// x有可能为负,需要调整为正数
  19. cout<<x*n%a<<endl;//A=m*B,x=m/n --> m=x*n,(A/B)%9973=(x*n*B/B)%9973=(x*n)%9973
  20. }
  21. return ;
  22. }

解法二:试探法。根据题意,输入的n=A%9973(没有输入A),A%B=0(A必能被B整除),B与9973互质(gcd(B,9973)=1)。
设x=(A/B)%9973(x是最终想计算的值,满足0<=x<9973),则9973k+x=A/B(k为整数:(A/B)/9973),得A=9973Bk+xB。
因为n=A%9973与A=9973Bk+xB,所以xB%9973=n,得xB=n+9973y,亦得xB-n=9973y。故:(xB-n)%9973=0
需要注意的是,变量类型为long long。

AC代码:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int main()
  4. {
  5. int t;
  6. long long n,b;//要用long long不然会溢出(n接近10的4次方,b接近10的9次方,取最大时已经超int)
  7. cin>>t;
  8. while(t--){
  9. cin>>n>>b;
  10. for(int x=;x<;x++)
  11. if((x*b-n)%==){cout<<x<<endl;break;}//试探算法
  12. }
  13. return ;
  14. }

解法三:乘法逆元。∵(A/B)%9973=A%9973*B-1%9973=n*B-1%9973,根据费马小定理a(p-1)≡1(mod p),即a*a(p-2)≡1(mod p),又由乘法逆元:ax≡1(mod p)可得x=a(p-2)%p=a-1%p(注意:p是质数,且p不能整除a(即gcd(a,p)=1),x为a关于模p的乘法逆元)∴最终可以推得n*B-1%p=n*B(p-2)%p(这里的p=9973),套一下整数快速幂模板即可。

AC代码:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long LL;
  4. const int mod=;
  5. LL mod_power(LL a,LL b){//整数快速幂
  6. LL ans=;
  7. while(b){
  8. if(b&)ans=ans*a%mod;
  9. a=a*a%mod;
  10. b>>=;
  11. }
  12. return ans;
  13. }
  14. int main(){
  15. int t;LL n,B;
  16. while(cin>>t){
  17. while(t--){
  18. cin>>n>>B;
  19. cout<<n*mod_power(B,mod-)%mod<<endl;//n*B^(p-2)%p
  20. }
  21. }
  22. return ;
  23. }

题解报告:hdu 1576 A/B(exgcd、乘法逆元+整数快速幂)的更多相关文章

  1. 【板子】gcd、exgcd、乘法逆元、快速幂、快速乘、筛素数、快速求逆元、组合数

    1.gcd int gcd(int a,int b){ return b?gcd(b,a%b):a; } 2.扩展gcd )extend great common divisor ll exgcd(l ...

  2. 题解报告:poj 3233 Matrix Power Series(矩阵快速幂)

    题目链接:http://poj.org/problem?id=3233 Description Given a n × n matrix A and a positive integer k, fin ...

  3. 【模拟题(电子科大MaxKU)】解题报告【树形问题】【矩阵乘法】【快速幂】【数论】

    目录: 1:一道简单题[树形问题](Bzoj 1827 奶牛大集会) 2:一道更简单题[矩阵乘法][快速幂] 3:最简单题[技巧] 话说这些题目的名字也是够了.... 题目: 1.一道简单题 时间1s ...

  4. 2017ACM暑期多校联合训练 - Team 2 1006 HDU 6050 Funny Function (找规律 矩阵快速幂)

    题目链接 Problem Description Function Fx,ysatisfies: For given integers N and M,calculate Fm,1 modulo 1e ...

  5. HDU 3923 Invoker(polya定理+乘法逆元(扩展欧几里德+费马小定理))

    Invoker Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 122768/62768K (Java/Other) Total Subm ...

  6. HDU 5868 Different Circle Permutation Burnside引理+矩阵快速幂+逆元

    题意:有N个座位,人可以选座位,但选的座位不能相邻,且旋转不同构的坐法有几种.如4个座位有3种做法.\( 1≤N≤1000000000 (10^9) \). 题解:首先考虑座位不相邻的选法问题,如果不 ...

  7. HDU 5793 A Boring Question (找规律 : 快速幂+逆元)

    A Boring Question 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5793 Description Input The first l ...

  8. hdu 2604 Queuing dp找规律 然后矩阵快速幂。坑!!

    http://acm.hdu.edu.cn/showproblem.php?pid=2604 这题居然O(9 * L)的dp过不了,TLE,  更重要的是找出规律后,O(n)递推也过不了,TLE,一定 ...

  9. hdu 1757 A Simple Math Problem (矩阵快速幂,简单)

    题目 也是和LightOJ 1096 和LightOJ 1065 差不多的简单题目. #include<stdio.h> #include<string.h> #include ...

随机推荐

  1. 【python】urllib2

    urllib2.urlopen(url[, data][, timeout]) 请求url,获得请求数据,url参数可以是个String,也可以是个Request参数 没有data参数时为GET请求, ...

  2. CentOS系统中常用查看系统信息和日志命令小结

    转载:http://www.3lian.com/edu/2015/04-09/204628.html 进程 # ps -ef # 查看所有进程 # top # 实时显示进程状态(另一篇文章里面有详细的 ...

  3. POJ3262 Protecting the Flowers 【贪心】

    Protecting the Flowers Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4418   Accepted: ...

  4. 修改linux环境变量配置文件

    发现error ImportError: dynamic module does not define module export function (PyInit_cv_bridge_boost) ...

  5. 关于java及多线程

    http://www.w3cschool.cc/java/java-multithreading.html

  6. 2016/3/26 weixin 头像 昵称 网页优化显示 缺表中数据 只有代码 无显示效果

    weixin.php <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...

  7. docker大全集

    1,什么是docker docker 最初是dotCloud公司创始人 Solomon Hykes 在法国期间发起的一个公司内部醒目,于 2013年 3 月以 Apache 2.0 授权协议开源, 主 ...

  8. Java中使用HttpRequest获取用户真实IP地址端口

    import javax.servlet.http.HttpServletRequest; /** * 自定义访问对象工具类 * * 获取对象的IP地址等信息 * @author X-rapido * ...

  9. mipi屏在内核可以显示logo但是u-boot无法显示的问题【转】

    本文转载自:http://blog.csdn.net/fulinus/article/details/45071721 平台:瑞芯的rk3288 u-boot版本:u-boot-2014.10 ker ...

  10. scrapy学习笔记:项目中 使用代理ip

    做为一个爬虫,最头疼的问题就是你的ip被封,想要在Scrapy领域无限制畅游,做好伪装是第一步,于是乎,抓取代理IP成了很多教程的开始部分.这里我说一下代理scrapy中代理ip,仅供大家借鉴! 代理 ...