码迷,mamicode.com
首页 > 其他好文 > 详细

原创题:小G与计算题

时间:2018-04-22 12:52:22      阅读:202      评论:0      收藏:0      [点我收藏+]

标签:lob   amp   pen   ++   ges   std   include   arc   注意   

小G与计算题

(calc.c/cpp)

题目背景

sxd又要AK了。于是,小G想要nai他一下:

技术分享图片

于是,sxd发火了。

sxd:既然你数学比我差你就没资格nai我!!!

sxd想跟你比一比计算能力

sxd认为自己配不上出这种傻逼计算题,就叫LGX出了一道。

做为小G好基友的你,只要你的程序能在1s内完成此题,小G就可以顺利地继续用正当理由nai SXD了。当然,小G也将以100分为奖励赠送给你。

题目描述

本次计算一共分三个步骤

  1. 定义\(a\$b=((((a^a)^a)^a)^{\cdots})^a\),等号右边一共有\(b\)\(a\)(注意是“一共”,底数也算一个,还看不懂的就看一下样例吧),计算\(a\$b\)的值,答案对\(1e9+7\)取模,答案记为\(ans_1\)
  2. 定义函数\(f:N_+\to N\)\(f(1)=0\),且对任意\(n\in N_+\)\(n\ge 2\),都有\[f(n)=\max\{f(j)+f(n-j)+j\mid j=1,2,3,\cdots,\lfloor \frac{n}{2}\rfloor\}.\]求出\(f(c)\)的值,答案对\(1e9+7\)取模,答案记为\(ans_2\)
  3. 计算\(C^{\min\{ans_1,ans_2\}}_{max\{ans_1,ans_2\}}\)的值,答案对\(9007\)取模。

Input

三个正整数\(a,b,c\)

Output

一个正整数\(ans\)

标程

#include <cstdio>

#define deb 0

typedef long long LL;

inline LL pow_mod(LL a,LL b,LL mod)
{
    a%=mod;
    LL ans=1;
    for(; b; b>>=1,a=a*a%mod)if(b&1)ans=ans*a%mod;
    return ans;
}

const LL mod=1e9+7;

inline LL solve1(LL a,LL b)
{
    return pow_mod(a,pow_mod(a,b-1,mod-1),mod);
}

inline LL solve2(LL n)
{
    if(n<=1)return 0;
    if(n&1) return (solve2(n>>1)+solve2((n>>1)+1)+(n>>1))%mod;
    else    return ((solve2(n>>1)<<1)%mod+(n>>1)%mod);
}

const LL mo=1e5+7;

LL farc[mo+3];
inline void prepare()
{
    farc[0]=1;
    for(LL i=1; i<=mo; ++i)farc[i]=(farc[i-1]*i)%mo;
}
inline LL Csmall(LL m,LL n)
{
    if(n<m) return 0;
    return farc[n]*pow_mod(farc[m],mo-2,mo)%mo*pow_mod(farc[n-m],mo-2,mo)%mo;
}
inline LL C(LL m,LL n)
{
    LL ans=1;
    while(n&&m&&ans)
    {
        ans=(ans*Csmall(m%mo,n%mo))%mo;
        n/=mo,m/=mo;
    }
    return ans;
}

inline LL calc(LL a,LL b,LL c)
{
    LL ans1=solve1(a,b);
    LL ans2=solve2(c);
    prepare();
#if deb
    printf("%lld %lld\n",ans1,ans2);
#endif
    if(ans1>ans2)return C(ans2,ans1);
    else    return C(ans1,ans2);
}

int main()
{
#if !deb
    freopen("calc.in","r",stdin);
    freopen("calc.out","w",stdout);
#endif
#if 0
    SXDAKZJOI^_^
#endif
    LL a,b,c;
    scanf("%lld%lld%lld",&a,&b,&c);
    printf("%lld",calc(a,b,c));
#if !deb
    fclose(stdin);
    fclose(stdout);
#endif
    return 0;
}

原创题:小G与计算题

标签:lob   amp   pen   ++   ges   std   include   arc   注意   

原文地址:https://www.cnblogs.com/pfypfy/p/8906024.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!