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

思维:(1)逆元+扩展欧几里得算法:满足a*k≡1 (mod p)的k值就是a关于p的乘法逆元。当且仅当gcd(k,p) = 1,如果可逆则可定义除法 x/k = x * a mod p

(2)扩展欧几里得算法+递推公式:运用扩展欧几里德算法能解出gcd(a,b)=a*x1+b*y1的x1和y1的值。

(3)数学思维解法:推等式+枚举某数让等式成立。

(4)费马小定理;

题目:

要求(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

AC代码

逆元:为什么要有乘法逆元呢? 当我们要求(a/b) mod p的值,且a很大,无法直接求得a/b的值时,我们就要用到乘法逆元。 我们可以通过求b关于p的乘法逆元k,将a乘上k再模p,即(a*k) mod p。其结果与(a/b) mod p等价。 (A/B)%9973,但由于A很大且gcd(B,9973) = 1),所以我们可以求B的逆元然后 k*B = 1 mod n 然后改写式子 (A/B)%9973 = A % 9973 * k%9973 B的逆元就用扩展欧几里德解  k*B = 1 mod n --> k*B + m*n = 1;

#include<iostream>/**逆元+拓展欧几里得*/
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
typedef long long int64;
int64 Exgcd(int64 a,int64 b,int64 &x,int64 &y)
{if(b == 0){x = 1,y = 0;return a;}else{int64 r = Exgcd(b,a%b,x,y);int64 temp = x;x = y, y = temp - a/b*y;return r;}
}
int main()
{int t;int64 n,b = 9973,B,x,y;scanf("%d",&t);while(t--){scanf("%I64d%I64d",&n,&B);int64 d = Exgcd(B,b,x,y);b = b / d;x = x / d ;x = (x % b + b) % b;/*求a最小正整数逆元x=x0+(a/gcd)*t*/printf("%I64d\n",(n%9973 * x%9973)%9973);/*x为n的逆元*/}return 0;
}

拓展欧几里得:

根据题目我们知道: n=A%9973,则n=A-A/9973*9973。又A/B=x,则A=Bx。所以Bx-A/9973*9973=n。即Bx-9973y=n。 在这里我们知道只要求出x的值就能算出x%9973的值,也就是(A/B)%9973的值。 利用扩展欧几里德算法可求出gcd(B,9973)=Bx1+9973y1=1的x1。题中说gcd(B,9973)=1;所以等式两边 同乘以n,得B(n*x1)-9973(-n*y1)=n。可知n*x1就是B*x-9973*y=n的解了!!!即x=n*x1。 在扩展欧几里得算法中得到的x可能为负值,所以还需要x=(x%9973+9973)%9973。

#include<cstdio>/**推等式+拓展欧几里得*/
#include<cstring>
void extgcd(int a,int b,int &x,int &y)
{if(b==0){x=1;y=0;return ;}else{extgcd(b,a%b,y,x);y-=(a/b)*x;}
}int main()
{int t,n,b,x,y;scanf("%d",&t);while(t--){scanf("%d%d",&n,&b);extgcd(b,9973,x,y);x*=n;x=(x%9973+9973)%9973;printf("%d\n",x);}return 0;
}

数学思维解法:

思路:设X=(A/B)%9973        因为n=A%9973,所以A=k*9973+n (k为一常数)        又因为X=(A/B)%9973,所以A/B=d*9973+X (d为一常数)      两边同乘以B,得:A=B*d*9973+B*X 即B*d*9973+B*X=k*9973+n 移项得:   B*d*9973+B*X-n=k*9973 所以题意转为  只要满足(B*X-n)%9973=0,X即为要求的结果。n的值知道,B的值知道,又因为x的取 值范围是0到9972,因此枚举x的值即可,满足条件的就是答案。

#include<cstdio>/**推等式+枚举某数让等式成立*/
int main()
{int n,a,i,t;long long b;scanf("%d",&t);while(t--){scanf("%d%lld",&n,&b);for(i=0;i<9973;++i){if((b*i-n)%9973==0)break;}printf("%d\n",i);}return 0;
}

(4)费马小定理:(易知费马定理是有限制的:a与p要互质)

#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
typedef long long ll;
int t;
ll n,m;
const int mod=9973;
int quickpow(ll a,ll b){ll ans=1;a%=mod;while(b){if(b&1) ans=ans*a%mod;b>>=1;a=a*a%mod;}return ans;
}
int main(){cin>>t;while(t--){cin>>n>>m;//cout<<"******"<<endl;cout<<n*quickpow(m,mod-2)%mod<<endl;}return 0;
}
//费马小定理   

A/B HDU - 1576 (逆元或拓展欧几里得或数学公式)多解法求大数结果相关推荐

  1. 数学--数论--逆元(拓展欧几里得)模板

    ACM常用模板合集 typedef long long ll; ll exgcd(ll a,ll b,ll &x,ll &y){if(!b){x=1;y=0;return a;}int ...

  2. 详细讲解【拓展欧几里得】

    exgcd(拓展欧几里得) 1.回顾辗转相除法求最大公倍数: (辗转相除法和下面所讲到的算法里面的m和n没什么关系可正可负 更没有大小关系的区分) 代码: #include<stdio.h> ...

  3. 拓展欧几里得模板/求逆元模板(java)

    拓展欧几里得模板 参考:哈尔滨理工大学ACM培训资料汇编/ACM-ICPC培训资料汇编* 基本原理 :设 a 和 b 不全为 0,则存在整数 x,y 使得 xa yb=gcd(a,b)=c 对于辗转相 ...

  4. 数学--数论--(逆元)扩展欧几里求解+证明

    欧几里得与扩展欧几里得 先解释一下符号: A≡B(modC)符号代表A模C与B模C相等,即A/C与B/C同余.A≡B (mod C)符号代表A模C与B模C相等,即A/C与B/C同余.A≡B(modC) ...

  5. 欧几里得定理 及 拓展欧几里得 小结

    [欧几里得定理] 定义: gcd ⁡ ( a , b ) = gcd ⁡ ( b , a m o d    b ) \gcd(a,b)=\gcd(b,a\mod b) gcd(a,b)=gcd(b,a ...

  6. 拓展欧几里得+例题~

    扩展欧几里德算法: 应用: ①求解不定方程 ②求解同余方程 ③求解模的逆元 看欧拉定理看吐了也还是有超级~~多的题目不会做,看的有晕又困!难受,看会别的压压惊~~希望拓展欧几里德的题目能对我稍稍稍稍稍 ...

  7. Romantic(拓展欧几里得)

    Romantic 点我找原题 直接用拓展欧几里得公式求出x和y,再除以a,b的最大公约数q,如果依然是整数,则输出,否则,x+=b,y-=a,再判断 一次,直到x和y都能被q整除,如果100次后还不能 ...

  8. 拓展欧几里得定理的应用

    扩展欧几里得定理的运用 首先,先重复一下拓展欧几里得的内容: 对于不全为 0 的整数a.b,一定存在一组解 x,y,使得 ax + by == gcd(a,b) 先说一下这个定理的三个用处(但是小细节 ...

  9. poj1061-青蛙的约会(拓展欧几里得java)

    题目: 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事情,既没有问清楚 ...

最新文章

  1. 缩小规模,OpenAI文本生成图像新模型GLIDE用35亿参数媲美DALL-E
  2. SpringSecurity权限表达式
  3. Validation failed for one or more entities. See ‘EntityValidationErrors’解决方法
  4. 16 大常考算法知识点,你掌握了吗?
  5. 前端学习(3289):react hook state-hook
  6. Quartus II常见问题集锦
  7. ArchLinux学习之环境变量
  8. 常见的垃圾回收器算法有哪些,各有什么优劣?
  9. flinksql获取系统当前时间搓_FlinkSQL 动态加载 UDF 实现思路
  10. 在mc中直接加aswing组件,该组件还需最后用validate()方法
  11. 《概率论与数理统计》作业一,python画频率分布表
  12. java画五角星_java 画五角星 填充五角星
  13. 【项目跟进】如何写PPT
  14. 如何做好实施前准备?
  15. 微信公众号数据2019_2019年9月原创公众号排行榜数据报告出炉
  16. vb.net 教程 20-4 库存管理系统3.14 出库单操作(FormStorageOutOrder)
  17. 手淘移动端适配的方案学习和相关思考
  18. 使用bat文件做定时任务
  19. 鸡肋的Redis事务
  20. OpenJWeb(v1.9)企业级信息化应用平台开源版发布公告(基于Java语言开发)

热门文章

  1. Android插件化开发之用DexClassLoader加载未安装的APK资源文件来实现app切换背景皮肤
  2. Android之PowerManager简介
  3. php基础教程 第七步数组补充及循环基础
  4. 【C语言简单说】二:第一个C语言程序详解(3)
  5. python画方波_python实现周期方波信号频谱图
  6. 世界各国的教育差距有多大?这几部全世界都在热议的教育纪录片,揭开一切.........
  7. 每日一笑 | 一些关于集合的知识
  8. mysql二阶段提交有什么问题_MySQL的事务两阶段提交的技术有什么意义?
  9. 现在银行etl还要做拉链表吗_hive 拉链表 实现全量数据 增量更新
  10. java map 值排序_使用Java8 Stream API对Map类型按照键或值进行排序