2019.9.1——nanjin网络赛[B. super_log]

问题虫洞: B. super_log

 

黑洞内窥:

定义一个式子:

键入a,b,m;

求一个最小的x,满足上式,然后输出x%m;

 

思维光年:

易推导得出:

x = a^a^a^.........^a^a(一共b个a的高阶幂)%m;

然后就是欧拉降幂了:

一开始我的做法:

因为欧拉降幂有条件限制,一开始忘记了这个限制条件,导致疯狂的wa(这时我用的是for循环处理),

后来即使我发现了是限制条件的问题,由于代码能力太弱,

不会用for循环继续限制这个条件,并且本人对递归也比较迷~~~

遂将idea转达队友,然后队友找个板子就A掉了,,!(我太难了~~~)

 

ACcode:

#include<bits/stdc++.h>
#define Mod(a,b) a<b?a:a%b+b	//重定义取模,按照欧拉定理的条件
#define LL long long
#define N 100010
using namespace std;

LL n,q,m,a,b,T;
map<LL,LL> mp;

LL qpow(LL x,LL n,LL m)
{
    LL res=1;
    while(n)
    {
        if (n&1)
            res=Mod(res*x,m),n--;
        x=Mod(x*x,m);
        n>>=1;
    }
    return res;
}

LL phi(LL k)
{
    LL i,s=k,x=k;
    if (mp.count(k))
        return mp[x];			//记忆化存储
    for(i = 2; i * i <= k; i++)         //欧拉函数
    {
        if(k % i == 0)
            s = s / i * (i - 1);
        while(k % i == 0)
            k /= i;
    }
    if(k > 1)
        s = s / k * (k - 1);
    mp[x]=s;
    return s;
}

LL solve(LL l,LL r,LL m)
{
    if (l==r||m==1)
        return Mod(a,m);		        //限制条件
    return qpow(a,solve(l+1,r,phi(m)),m);	//往上递归
}

int main()
{
    scanf("%d",&T);
    while(T--)
    {
        scanf("%lld%lld%lld",&a,&b,&m);
        if(m == 1)
            printf("0\n");
        else if(b == 0 || a == 1)
            printf("1\n");
        else
            printf("%lld\n",solve(1,b,m) % m);
    }
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
链接:https://ac.nowcoder.com/acm/contest/59840/F 来源:牛客网 下个学期XCPC有很多场比,但是每支队伍被限定每年只能参加一部分的比,这让身为队长的 Newbie_QQH犯难了,该如何做站选择,于是他找到了你来帮他解决这个问题。 问题是这样的: XCPC一共有N场比,每支队伍只能参加K场比站信息包括站名字,站难度,站距离,是否有参资格。 站名字用字符串表示。 通过对每个站的研究,队长对每场比都得出了一个难度系数。(不同站的难度系数可能相同) 每一场站的参要求不同,如果没有参资格就不能报名参。 Newbie_QQH想参加尽可能更简单的比,如果比的难度系数相同,他会倾向选站距离更近的比。请你帮他设计程序选择比。 输出选择站数量和站的信息。 如果有多个站选择,优先输出难度系数简单,站距离更近的比,保证不会有两个难度系数和站距离都一样的站。 输入描述: 第1行输入两个整数N和K,代表比数量,参限制 第2-N+1行每行输入Si,Ai,Bi,Ci,代表站名字,难度,距离,是否有参资格(1代表有资格,0代表无资格) 输出描述: 第一行输出参加站的数量cnt 接下来cnt行输出站信息。 示例1 输入 复制 5 2 icpc_shenyang 100 20 1 icpc_xian 10 20 1 icpc_jinan 10 20 0 icpc_nanjin 20 15 1 icpc_hangzhou 20 18 1 输出 复制 2 icpc_xian 10 20 1 icpc_nanjin 20 15 1用代码表示出来
06-12
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值