suxxsfe

一言(ヒトコト)

数论题目

P1082 同余方程

即求a模b的逆元x
因为x在模b意义下唯一,所以最小整数解即逆元

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<iomanip>
#include<cstring>
#define R register
#define EN printf("\n")
#define LL long long
inline LL read(){
	LL x=0,y=1;
	char c=getchar();
	while(c<'0'||c>'9'){if(c=='-') y=-1;c=getchar();}
	while(c>='0'&&c<='9'){x=x*10+(c^48);c=getchar();}
	return x*y;
}
int gcd(LL a,LL b,LL& x,LL& y){
	if(b){
		int d=gcd(b,a%b,y,x);
		//d=y*b+x*(a%b)
		//d=y*b+x*(a-(a/b)*b)
		//d=y*b+x*a-x*(a/b)*b
		//d=x*a+(y-(a/b)*x)*b
		y-=(a/b)*x;
		return d;
	}
	x=1;y=0;
	//赋值后,上一层的d=0*0+a*1=a
	return a;
}
int main(){
	LL a=read(),b=read(),x,y;
	gcd(a,b,x,y);
	while(x<0) x+=b;
	x%=b;
	printf("%lld",x);
	return 0;
}

P1043 约数研究

求1到n每个数的约数个数和
因为约数个数和等于倍数个数和(一个整除关系,可以看作约数关系或倍数关系,即约数和倍数一一对应)
所以答案为\(\sum_{i=1}^n \lfloor \frac{n}{i} \rfloor\)

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<stack>
#include<iomanip>
#include<cstring>
#define R register
#define LL long long
inline int read(){
	int x=0,y=1;
	char c=getchar();
	while(c<'0'||c>'9'){
		if(c=='-') y=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		x=x*10+(c^48);
		c=getchar();
	}
	return x*y;
}
int n;
LL ans;
int main(){
	n=read();
	for(R int i=1;i<=n;i++) ans+=n/i;
	printf("%lld",ans);
	return 0;
}

SP2 PRIME1 - Prime Generator

求m,n之间的质数
因为要判断的数都小于等于n,所以如果是合数,一定有质因数小于等于\(\sqrt{n}\)
所以先求出这些质数,再在m到n的区间里用它们试除暴力筛

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<iomanip>
#include<cstring>
#define R register
#define EN printf("\n")
#define LL long long
inline int read(){
	int x=0,y=1;
	char c=getchar();
	while(c<'0'||c>'9'){if(c=='-') y=-1;c=getchar();}
	while(c>='0'&&c<='9'){x=x*10+(c^48);c=getchar();}
	return x*y;
}
const int sqrtn=35000;
int n,m,prime[10006],notpr[35000];
inline void getprime(){
	for(R int i=2;i<=sqrtn;i++){
		if(!notpr[i]) prime[++prime[0]]=i;
		for(R int j=1;j<=prime[0]&&i*prime[j]<=sqrtn;j++){
			notpr[i*prime[j]]=1;
			if(!(i%prime[j])) break;
		}
	}
}
inline void isprime(int num){
	if(num==1) return;
	int sqrt=std::sqrt(num);
	for(R int i=1;i<=prime[0]&&prime[i]<=sqrt;i++)
		if(!(num%prime[i])) return;
	printf("%d\n",num);
}
int main(){
	int t=read();
	getprime();
	while(t--){
		m=read();n=read();
		for(R int i=m;i<=n;i++) isprime(i);
		EN;
	}
	return 0;
}
posted @ 2020-03-19 20:45  suxxsfe  阅读(174)  评论(0编辑  收藏  举报