zoukankan      html  css  js  c++  java
  • BZOJ:2242: [SDOI2011]计算器

    题解:BSGS

    问题:map空间 

      BSGS判无解 a%p!=0
      0与最小非负整数 有区别
      函数传参类型转换int->long long long long ->int;
      费马小定理充分必要 性?

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<map>
    #include<cmath>
    using namespace std;
    typedef long long Lint;
    
    int T,k;
    Lint mm;
    
    map<Lint,int>ma;
    
    Lint ksm(Lint a,Lint p){
    	Lint ret=1;
    	for(;p;p>>=1,a=a*a%mm){
    		if(p&1)ret=ret*a%mm;
    	}
    	return ret;
    }
    
    void gcd(Lint a,Lint b,Lint &d,Lint &x,Lint &y){
    	if(b==0){
    		d=a;x=1;y=0;
    	}else{
    		gcd(b,a%b,d,y,x);
    		y-=x*(a/b);
    	}
    }
    
    int main(){
    	scanf("%d%d",&T,&k);
    	while(T--){
    		if(k==1){
    			Lint a,p;
    			scanf("%lld%lld%lld",&a,&p,&mm);
    			printf("%lld
    ",ksm(a,p));
    		}
    		if(k==2){
    			Lint a,c,b,x0,y0,d;
    			scanf("%lld%lld%lld",&a,&c,&b);
    			gcd(a,b,d,x0,y0);
    			if(c%d!=0){
    				printf("Orz, I cannot find x!
    ");
    				continue;
    			}else{
    				x0=c/d*x0;b=b/d;
    				printf("%lld
    ",(x0%b+b)%b);
    			}
    		}
    		if(k==3){
    			Lint a,c,p;
    			scanf("%lld%lld%lld",&a,&c,&p);
    			Lint m=ceil(sqrt(p));
    			ma.clear();
    			int flag=0;mm=p;
    			Lint tmp=ksm(a,m);
    			if(a%p==0){
    				printf("Orz, I cannot find x!
    ");
    				continue;
    			}
    			for(Lint x=c%p,i=0;i<=m;++i,x=x*a%p)ma[x]=i;
    			for(Lint x=tmp%p,i=1;i<=m;++i,x=x*tmp%p){
    				if(ma.count(x)&&(m*i-ma[x]!=0)){
    					printf("%d
    ",m*i-ma[x]);
    					flag=1;
    					break;
    				}
    			}
    			if(!flag)printf("Orz, I cannot find x!
    ");
    		}
    	}
    	return 0;
    }
    

      

    自己还是太辣鸡了
  • 相关阅读:
    单元测试
    英语学习app案列分析
    基于GUI的四则运算
    个人作业1——四则运算题目生成程序(基于控制台)
    一种新体验———构建之法
    个人作业3——个人总结(Alpha阶段)
    单元测试
    英语学习APP案例分析
    结对编程(70,73)
    软件工程HW1-四则运算软件
  • 原文地址:https://www.cnblogs.com/zzyer/p/8179229.html
Copyright © 2011-2022 走看看