chamber的小屋——关于数论的杂七杂八

快速幂:

ll qpow(ll a,ll b,ll p){
	ll ans=1;
	while(b){
		if(b&1) ans=(ans*a)%p;
		b>>=1;
		a=(a*a)%p;
	} 
	return ans;
}

millar-rabin:

在代码实现上,为了常数优化,所以选择倒着进行操作

const int P[15]={2,3,5,7,9,11,13,17,19};

bool mr(int x) {
  	rop(i,0,9) if(x==P[i]) return 1;
 	int u=x-1,t=0;
  	while(u%2==0){
  		u>>=1;
  		++t;
  	}
	rop(i,0,9){
    	int a=P[i];
		int v=qpow(a,u,x);
    	if(v==1) continue;
    	int s;
    	for(s=0;s<t;++s){
      		if(v==x-1) break;
      		v=(ll)v*v%x;
    	}
    	if(s==t) return 0;
  	}
  	return 1;
}

exgcd:

ll exgcd(ll a,ll b,ll &x,ll &y){
	if(!b){
		x=1;
		y=0;
		return a;
	}
	ans=exgcd(b,a%b,x,y);
	ll t=x;
	x=y;
	y=t-a/b*y;
	return ans;
}

gcd:

int gcd(int a,int b){
	if(b==0) return a;
	else return gcd(b,a%b);
}

int gcd(int a,int b){
	if(a==b) return a;
	if(!(a&1)&&!(b&1)) return 2*gcd(a>>1,b>>1);
	else if((a&1)&&(b&1)){
		if(a>b) return gcd(b,a-b);
		else return gcd(a,b-a);
	}
	else {
		if(a%2) return gcd(a,b>>1);
		else return gcd(a>>1,b);
	}
}

1~n的逆元

int getny(ll x){
	return qpow(x,fp,p);
}
int main(){
	n=iread();
	p=iread();
	FOR(i,1,n){
		c[i]=(c[i-1]*1ll*i)%p;
	}
	inv[n]=getny(c[n]);
	RFOR(i,n-1,1){
		inv[i]=(inv[i+1]*1ll*(i+1))%p;
	}
	FOR(j,1,n){
    	printf("%d\n",inv[j]*1ll*c[j-1]%p);
	}
	return 0;
}

线性筛:

void init(ll n){
	bj[1]=1;
	FOR(i,2,n){
		if(bj[i]==0){
			pm[++tot]=i;
		}
		for(int j=1;j<=tot&&pm[j]*i<=n;++j){
			bj[pm[j]*i]=1;
			if(!(i%pm[j])) break;
		}
	}
}

线性筛求欧拉函数:

void init(ll n){
	bj[1]=1;
	FOR(i,2,n){
		if(bj[i]==0){
			pm[++tot]=i;
			phi[i]=i-1;
		}
		for(int j=1;j<=tot&&pm[j]*i<=n;++j){
			bj[pm[j]*i]=1;
			if(!(i%pm[j])){
				phi[i*pm[j]]=phi[i]*pm[j];
				break;
			}
			else {
				phi[i*pm[j]]=phi[i]*phi[pm[j]];
			}
		}
	}
}

线性筛约数个数

void init(ll n){
	bj[1]=1;
	FOR(i,2,n){
		if(bj[i]==0){
			pm[++tot]=i;
			phi[i]=i-1;
		}
		for(int j=1;j<=tot&&pm[j]*i<=n;++j){
			bj[pm[j]*i]=1;
			if(!(i%pm[j])){
				phi[i*pm[j]]=phi[i]*pm[j];
				break;
			}
			else {
				phi[i*pm[j]]=phi[i]*phi[pm[j]];
			}
		}
	}
}

1~n!分解质因数:

#include<cstdio>
#include<string>
#define FOR(i,a,b) for(int i=(a);i<=(b);++i)
int iread(){char c;int x=0,y=1;c=getchar();while(c<'0'||c>'9'){if(c=='-') y=-1;c=getchar();}while(c>='0'&&c<='9'){x=(x<<3)+(x<<1)+(c^'0');c=getchar();}return x*y;}
int n;
const int N=1e6+5;
bool vis[N];
int cnt[N];
int p[N],tot;
void pre(int n){
    FOR(i,2,n){
        if(!vis[i]){
            p[++tot]=i;
        }
        FOR(j,1,tot){
            int pri_j=p[j];
            if(i*pri_j>n) break;
            vis[i*pri_j]=1;
            if(i%pri_j==0){
                break;
            }
        }
    }
}
int qmax(int a,int b){
    return (a>b ? a : b);
}
int dmax=0;
void work(int x){
    int jx=x;
    FOR(i,1,tot){
        int pri=p[i];
        if(pri*pri>jx||pri>x) break;
        while(x%pri==0){
            ++cnt[pri];
            x/=pri;
            dmax=qmax(dmax,pri);
        }
    }
    if(x){
        ++cnt[x];
        dmax=qmax(dmax,x);
    }
}
int main(){
    n=iread();
    pre(n);
    FOR(i,1,n) work(i);
    FOR(j,1,tot){
        int i=p[j];
        if(i>dmax) break;
        if(cnt[i]) printf("%d %d\n",i,cnt[i]);
    }
    return 0;
}



int n;
const int N=1e6+5;
int cnt[N];
int cnt_[N];
int p[N],tot,top;
int vis[N];
void dfs(int x){
    FOR(j,1,tot){
        if(x*p[j]>n) return ;
        else {
            cnt_[++top]=p[j];
            if(!vis[x*p[j]]){
                FOR(l,1,top){
                    ++cnt[cnt_[l]];
                }
            }
            vis[x*p[j]]=1;
            dfs(x*p[j]);
            --top;
        }
    }
}
int main(){
    n=iread();
    FOR(i,2,n){
        if(!vis[i]){
            p[++tot]=i;
            ++cnt[i];
            cnt_[++top]=i;
            dfs(i);
            top=0;
        }
    }
    FOR(i,2,n){
        if(cnt[i]){
            printf("%d %d\n",i,cnt[i]);
        }
    }
    return 0;
}

excrt:

ll exgcd(ll a,ll b,ll &x,ll &y,ll c){
	if(!b){
		x=c/a;
		y=0;
		return a;
	}
	ll g=exgcd(b,a%b,y,x,c);
	y-=a/b*x;
	x=x%(b/g);
	y=(c-a*x)/b;
	return g;
}
ll gsc(ll a,ll b,ll p){
	ll ans=0;
	while(b){
		if(b&1) ans=(ans+a)%p;
		b>>=1;
		a=(a+a)%p;
	} 
	return ans;
}
int n;
void excrt(ll &A,ll &P,ll a,ll p) {
	ll x=0,y=0;
	ll g=exgcd(p,-P,x,y,A-a);
	g=(g<0 ? -g : g);
	P=p/g*P;
	A=a+gsc(x,p,P);
	A=(A%P+P)%P;
}
ll A,P,a,p;
int main(){
	n=iread();
	scanf("%lld%lld",&P,&A);
	FOR(i,2,n) {
		scanf("%lld%lld",&p,&a);
		excrt(A,P,a,p);
	}
	cout<<(long long)((A%P+P)%P);
	return 0;
}

卡特兰数:

ll qpow(ll a,ll b,ll p){
	ll ans=1;
	while(b){
		if(b&1) ans=(ans*a)%p;
		b>>=1;
		a=(a*a)%p;
	} 
	return ans;
}
const int N=2e5+5;
const int mod=1e9+7;
ll f[N],c[N]={1},ans;
void init(){
	FOR(i,1,N-3) c[i]=c[i-1]*i%mod;
}
ll C(int n,int m){
	return c[n]*qpow(c[m],mod-2,mod)%mod*qpow(c[n-m],mod-2,mod)%mod;
}
int n;
int main(){
	n=iread();
	init();
	cout<<C(2*n,n)*qpow(n+1,mod-2,mod)%mod;
	return 0;
}

bsgs:

ll bsgs(ll a,ll b,ll p){
	map<ll,ll> hs;
	hs.clear();
	b%=p;
	ll t=sqrt(p)+1;
	rop(i,0,t){
		hs[b*qpow(a,i,p)%p]=i;
	}
	a=qpow(a,t,p);
	if(!a) return (!b ? 1 : -1);
	FOR(i,1,t){
		ll val=qpow(a,i,p);
		ll j=(hs.find(val)==hs.end() ? -1 : hs[val]);
		if(j>=0&&i*t-j>=0) return i*t-j;
	}
	return -1;
}

省事的求组合数:

ll c[N]={1};

void init(){
	FOR(i,1,N-5) c[i]=c[i-1]*i%mod;
}
ll C(int n,int m){
    if(m>n||n<0||m<0) return 0;
	return c[n]*qpow(c[m],mod-2,mod)%mod*qpow(c[n-m],mod-2,mod)%mod;
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
ISPE(International Society for Pharmaceutical Engineering)控温室是一种专门用于药物工业的设备,用于控制和维持特定温度条件的封闭环境。它通常用于药品制造、质量控制和研发过程中,以确保药品的稳定性和质量。 ISPE控温室具有以下特点: 1. 温度控制:ISPE控温室具备精确的温度控制功能,可以根据需要设置和维持特定的温度范围。这对于药品质量和稳定性至关重要,因为许多药物的有效性和物化特性会随温度变化而改变。通过控温,药品制造商和研究人员可以在稳定的温度条件下进行研发和生产,以确保药品质量符合预期。 2. 精确度和稳定性:ISPE控温室设计和制造时注重精度和稳定性。它采用高精度的温度控制系统和优质的绝缘材料,以减少温度波动和外界温度对内部环境的影响。这种设计保证了控温室内部能够提供准确、稳定的温度环境,使药品制造过程更加可靠和重复性。 3. 安全性:ISPE控温室还具备重要的安全功能。它配备了安全措施,如过温保护系统和报警装置,以确保在温度异常或意外情况下能及时采取措施避免药品受损或危害人员安全。控温室还可以提供密封的环境,减少外部污染物和湿度对药品质量的影响。 总之,ISPE控温室是一种用于药物工业的设备,旨在提供精确稳定的温度环境,以确保药品的质量和稳定性。通过控温室,药品制造商和研究人员可以在一定温度范围内进行研发、生产和质量控制,满足监管要求并确保药品的安全和有效性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值