zoukankan      html  css  js  c++  java
  • BZOJ:2186: [Sdoi2008]沙拉公主的困惑

    问题:可能逆元不存在吗

    题解:

    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 3438 小M的作物
    洛谷 1126 机器人搬重物
    hdu 4055 Number String
    顺序对齐
    codevs 1300 文件排版
    NOIP 2015 提高组 Day2
    poj 2484 A Funny Game
    51nod 1548 欧姆诺姆和糖果 (制约关系优化枚举)
    hdu 1907 John (anti—Nim)
    hdu 2516 取石子游戏 (斐波那契博弈)
  • 原文地址:https://www.cnblogs.com/zzyer/p/8179199.html
Copyright © 2011-2022 走看看