首页 > 代码库 > 数论学习(题库有很多啦。)
数论学习(题库有很多啦。)
逆元模板题 hdu1576
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)。
每组数据有两个数n(0 <= n < 9973)和B(1 <= B <= 10^9)。
Output
对应每组数据输出(A/B)%9973
Sample Input
21000 5387 123456789
Sample Output
7922 6060
#include<bits/stdc++.h>#define int long longusing namespace std;int b,a;void exgcd(int a,int b,int &d,int &x,int &y){ if(!b)d=a,x=1,y=0; else exgcd(b,a%b,d,y,x),y-=(a/b)*x;}int inv(int a,int n){ int d,x,y; exgcd(a,n,d,x,y); return d==1?(x+n)%n:-1;}main(){ int n; cin>>n; while(n--) { cin>>a>>b; int x=inv(b,9973); printf("%lld\n",(a*x)%9973); } return 0;}
线段树HDU5475
搜过来的题目试求逆元,但是细想发现不对劲,因为你除再取mod是不可以的(可以想一下为什么),于是我就不知道怎么做了,看了网上的题解神奇的发现是线段树???然后单点更新,维护乘积就可以了。。
写的时候不知道scanf %lld为什么萎了,然后就用cin水过去了。。本以为会卡时间。。
#include<bits/stdc++.h>#define mid (l+(r-l)/2)#define ls (rt<<1)#define rs (rt<<1|1)#define int long longusing namespace std;int tr[500000<<2],n,t,mod,t1,t2;void build(int l,int r,int rt){ tr[rt]=1;if(l==r) return ; build(l,mid,ls),build(mid+1,r,rs);}void update(int l,int r,int rt,int L,int C){ if(l==r){tr[rt]=C;return ;} if(L<=mid) update(l,mid,ls,L,C); else update(mid+1,r,rs,L,C); tr[rt]=(tr[ls]*tr[rs])%mod;}main(){ scanf("%lld",&t); for(int kkk=1;kkk<=t;kkk++) { printf("Case #%lld:\n",kkk); cin>>n>>mod; build(1,n,1); for(int i=1;i<=n;i++) { scanf("%lld%lld",&t1,&t2); if(t1==1) update(1,n,1,i,t2); if(t1==2) update(1,n,1,t2,1); cout<<tr[1]%mod<<"\n"; } } return 0;}
欧拉定理的证明
摘自网络
数论学习(题库有很多啦。)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。