1636:例 6计算器

Posted smartljy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1636:例 6计算器相关的知识,希望对你有一定的参考价值。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll T,K;ll y,z,p;
void solve1()

    ll ans=1;
    while(z)
    
        if(z&1) ans=ans*y%p;
        y=y*y%p;
        z>>=1;
    
    printf("%lld\n",ans);

void exgcd(ll a,ll b,ll &d,ll &x,ll &y0)

    if(!b)
    
        d=a;
        x=1;
        y0=0;
    
    else
    
        exgcd(b,a%b,d,x,y0);
        ll t=x;
        x=y0;
        y0=t-a/b*y0;
    

ll gcdd(ll x,ll y0)

    if(y0==0)
    return x;
    return gcdd(y0,x%y0);

void solve2()

    ll d,x,y0;
    exgcd(y,p,d,x,y0);
    if(z%d!=0) 
    
        printf("Orz, I cannot find x!\n");
        return ;
    
    printf("%lld\n",((z/d*x)%(p/d)+p/d)%(p/d));

map<ll,ll>Map;
void solve3()

    ll d=1,x,y0,gcd,dd;
    Map.clear();
    y%=p;
    //z%=p;
    dd=gcdd(y,p);
    if(dd!=1)     printf("Orz, I cannot find x!\n");return ;
    ll m=ceil(sqrt(p)),tmp=1;
    Map[1]=m+1;
    for(ll i=1;i<m;i++)
    
        tmp=tmp*y%p;
        if(!Map[tmp]) Map[tmp]=i;
    
    tmp=tmp*y%p;
    for(ll j=0;j<m;j++)
    
        exgcd(d,p,gcd,x,y0);
        x=((x*z/gcd)%(p/gcd)+p/gcd)%(p/gcd);
        int t=Map[x];
        if(t)
        
            if(t==m+1) t=0;
            printf("%lld\n",j*m+t);
            return;
        
        d=d*tmp%p;
    
    printf("Orz, I cannot find x!\n");

int main()

    scanf("%lld%lld",&T,&K);
    while(T--)
    
        scanf("%lld%lld%lld",&y,&z,&p);
        if(K==1) solve1();
        else if(K==2) solve2();
        else solve3();
    
    return 0;

这道题只要用朴素算法的bsgs就行了,数据中的情况都是基本情况没有变形但是要注意加一个判断语句

以上是关于1636:例 6计算器的主要内容,如果未能解决你的问题,请参考以下文章

Pangu and Stones HihoCoder - 1636 区间DP

Python科学计算系列6—积分

简易计算器

泰勒公式在近似计算中的应用

精通MATLAB最优化计算的实 例 目 录

POJ 2728 JZYZOJ 1636 分数规划 最小生成树 二分 prim