首页 > 其他 > 详细

BZOJ:2186: [Sdoi2008]沙拉公主的困惑

时间:2018-01-02 23:06:26      阅读:341      评论:0      收藏:0      [点我收藏+]

问题:可能逆元不存在吗

题解:

Gcd(a,b)==Gcd(b,a-b);

从数据范围可以看出应该求M!的欧拉函数;

然后通过Gcd转化过去

一开始没想到

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long Lint;
const int maxT=20000;
const int maxn=10000009;
int T,r;
int mn=0,mm=0;

int inn[maxT];
int inm[maxT];
Lint fac[maxn];

int vis[maxn]= {0};
int prime[maxn],cntprime=0;
int Lineshake() {
	vis[1]=1;
	for(int i=2; i<=mm; ++i) {
		if(!vis[i]) {
			prime[++cntprime]=i;
		}
		for(int j=1; (j<=cntprime)&&(i*prime[j]<=mm); ++j) {
			vis[i*prime[j]]=1;
			if(i%prime[j]==0)break;
		}
	}
}

Lint ksm(Lint a,Lint p) {
	Lint ret=1;
	for(; p; p>>=1,a=a*a%r) {
		if(p&1)ret=ret*a%r;
	}
	return ret;
}
Lint inv(Lint x) {
	return ksm(x,r-2);
}

Lint phi[maxn];

int main() {
	scanf("%d%d",&T,&r);
	for(int i=1; i<=T; ++i) {
		scanf("%d%d",&inn[i],&inm[i]);
		mn=max(mn,inn[i]);
		mm=max(mm,inm[i]);
	}

	fac[1]=1;
	for(int i=2; i<=mn; ++i)fac[i]=fac[i-1]*i%r;
	Lineshake();

	phi[1]=1;
	for(int i=2; i<=mm; ++i) {
		if(!vis[i]) {
			phi[i]=phi[i-1]*(i-1)%r*inv(i)%r;
		} else {
			phi[i]=phi[i-1];
		}
	}

	for(int i=1; i<=T; ++i) {
		printf("%lld\n",fac[inn[i]]*phi[inm[i]]%r);
	}
	return 0;
}

  

 

BZOJ:2186: [Sdoi2008]沙拉公主的困惑

原文:https://www.cnblogs.com/zzyer/p/8179199.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!