Gym-102888C 数码管(快速幂( 次方很大是个字符串级别,要对次方分割 ))

题意:本题其实就是要求6的n/2次方,n如果是个奇数再乘以4,仔细分析分析就可以得出。
题目

#include <iostream>
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=998244353;
char ch[1000000];
ll flag;
void chu()              //模拟大数除法
{
    char c=ch[strlen(ch)-1];
    ll t=c-'0';
    if(t%2==0)flag=0;
    else flag=1;      //这里判断最后一位是奇数还是偶数,是奇数就要再最后再×4

    ll ans=0;
    ll len=strlen(ch);
    for(ll i=0; i<len; i++)  //模拟大数除法
    {
        ll t=ch[i]-'0'+ans*10;  //ans代表是否给后面那一位剩过去一个1
        ans=0;
        if(t%2==0&&t!=0)
        {
            t=t/2;
            ch[i]=t+'0';
        }
        else if(t==0)
        {
            continue;
        }
        else if(t%2!=0)
        {
            t=t/2;
            ch[i]=t+'0';
            ans++;
        }
    }

}
ll kuai(ll a,ll b){   //快速幂模板
    ll ans=1;
    while(b){
        if(b&1)ans=ans*a%mod;
        b=b>>1;
        a=a*a%mod;
    }
    return ans;
}
ll kuai_father(ll a){
    ll ans=1;
    int len=strlen(ch);
    for(int i=len-1;i>=0;i--){
        int t=ch[i]-'0';
        ans=ans*kuai(a,t)%mod;//再把a求次方,然后和ans*起来,代表指数的相加
        a=kuai(a,10)%mod;//先算出每一位儿的a的10次方,然后再求这个数的t次方
    }         //这里第一为是10的零次方,所以这里求次方放到下面,代表求下一个t的次方,
    return ans;//每进一位,求个10次方
}

void solve()
{
    scanf("%s",ch);
    chu();    //先用大数除法除个2,因为取模和除法不能同时在过程中出现,不然会出问题
    ll sum=1;
    sum=kuai_father(6);//次方很大求法,把次方分解成一位一位的,当然对应的要把每一位的次方×给他
    if(flag==1)sum=sum*4%mod;
    printf("%lld\n",sum);
}
int main()
{
    solve();
    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值