码迷,mamicode.com
首页 > 其他好文 > 详细

数论学习(题库有很多啦。)

时间:2017-07-07 21:33:30      阅读:132      评论:0      收藏:0      [点我收藏+]

标签:mono   desc   define   des   gcd   做了   image   inpu   build   

逆元模板题 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)。
Output
对应每组数据输出(A/B)%9973
Sample Input
2 1000 53 87 123456789
Sample Output
7922 6060
#include<bits/stdc++.h>
#define int long long
using 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 long
using 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;
}

 欧拉定理的证明

技术分享

技术分享

摘自网络

 

数论学习(题库有很多啦。)

标签:mono   desc   define   des   gcd   做了   image   inpu   build   

原文地址:http://www.cnblogs.com/foreverpiano/p/7133917.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!