[HDU 2065] "红色病毒"问题 数论

http://acm.hdu.edu.cn/showproblem.php?pid=1521

思路:以为是母函数直接求,一看题目发现 maya 不对啊2^64次方,只能去看大牛的题解

母函数f(x)=(1+x/1!+x^2/2!+x^3/3!…+x^n/n!)^2+(1+x^2/2!+x^4/4!+x^6/6!…+…)^2;
泰勒公式:e^x=1+x/1!+x^2/2!+x^3/3!…+x^n/n!;e^(-x)=1-x/1!+x^2/2!-x^3/3!+…-…;
e^x+e^(-x)=1+x^2/2!+x^4/4!+x^6/6!…+…;
f(x)=e^(2x) * ((e^x+e^(-x))/2)^2
= (1/4) * e^(2x) * (e^(2x) + 2 + e^(-2x))
= (1/4) * (e^(4x) + 2*e^(2x) +1)
   = (1/4) * ( (1+4x/1!+(4x)^2/2!+(4x)^3/3!+…+(4x)^n/n!) + 2*(1+2x/1!+(2x)^2/2!+(2x)^3/3!+…+(2x)^n/n!) +1)
得: x^n 项系数
a(n) = (1/4) * ((4x)^n/n! + 2*(2x)^n/n!)
= (1/4) * ( 4^n*x^n/n! + 2^(n+1)*x^n/n!)
= (4^(n-1) + 2^(n-1)) * x^n/n!
即所求 F(n) = (4^(n-1) + 2^(n-1)) % 100.

由于 n 比较大 所以要用到快速幂

#include <cstdio>
#include <cstring>
#include <iostream>

using namespace std;

typedef long long Loli;

Loli Calculation(Loli x, Loli y)
{
    Loli resl = 1;
    while(y){
        if(y & 1){
            resl = (resl * x) % 100;
        }
        x = (x * x) % 100;
        y >>= 1;
    }
    return resl;
}

int main()
{
    int Test;
    while(cin>>Test && Test)
    {
        int pos = 0;
        while(Test--){
            Loli n;
            cin>>n;
            cout<<"Case "<<++pos<<": ";
            if(n == 0){
                cout<<"1"<<endl;
            }
            else{
                cout<<(Calculation(2, n-1) + Calculation(4, n-1)) % 100<<endl;
            }
        }
        cout<<endl;
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

achonor

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值