zoukankan      html  css  js  c++  java
  • ACM-ICPC 2018 焦作赛区网络预赛 G. Give Candies

    题目链接:

    https://nanti.jisuanke.com/t/31716

    解题思路:

    具体的规律可以通过打表的形式,推出第n个值的答案是 2的(n-1)次方。然后再就是看数据范围,10的十万次方,这玩意long long绝对存不了,所以需要考虑别的情况。首先想到的是矩阵快速幂,但是,指数的十的十万次方,如果是long long 的话,快速幂就需要只是走32步,而这只是10的18次方,如果硬套的话肯定超时。所以就需要改进,打个比方,2的123次方,第一步,先求出2的1次方,第二步,将之前存过的计算结果自乘十次,然后再去乘以2的2次方,,当前的结果就是2的十次方乘以2的2次方,即2的12次方,以此类推。

    AC代码:

    #include<bits/stdc++.h>
    using namespace std;
    # define ll long long
    # define maxn 1000000
    # define inf 0x3f3f3f3f
    # define mod 1000000007
    char s[1000000];
    ll f1(ll t)
    {
        ll ans=1;
        ll s=2;
        while(t)
        {
            if(t&1)ans*=s;
            t>>=1;
            s=s*s;
        }
        return ans;
    }
    ll f2(ll t)
    {
        ll ans=1;
        for(int i=1; i<=10; i++)
        {
            ans*=t;
            ans%=mod;
        }
        return ans;
    }
    int main()
    {
        ll T;
        scanf("%lld",&T);
        while(T--)
        {
            scanf("%s",s);
            ll len=strlen(s);
            for(ll i=len-1; i>=0; i--)
            {
                if(s[i]!='0')
                {
                    s[i]=s[i]-1;
                    break;
                }
                if(s[i]=='0')
                {
                    s[i]='9';
                }
            }//首先本身减去1,因为最终答案是2的(n-1)次方。
            ll ans=1;
            for(ll i=0; i<len; i++)
            {
                ans=f1(s[i]-'0')*f2(ans);
                ans%=mod;
            }
            printf("%lld
    ",ans);
        }
        return 0;
    }
    
  • 相关阅读:
    课二 计算机硬件组成余下
    课一 计算机硬件组成
    电梯演讲视频
    团队成员个人介绍
    day-65Django
    day-64Django
    day-63Django
    day-62Django
    day-61Django
    day-60Django
  • 原文地址:https://www.cnblogs.com/letlifestop/p/10262910.html
Copyright © 2011-2022 走看看