洛谷P4451 [国家集训队]整数的lqp拆分 [生成函数]

传送门

题意简述:语文不好不会写,自己看吧

思路如此精妙,代码如此简洁,实是锻炼思维水经验之好题


这种题当然是一眼DP啦。

dpn为把n拆分后的答案。为了方便我们设dp0=1

由题意有

dpn=[n=0]+i=1ndpnifi

按照套路,我们考虑它的生成函数A(x)

A(x)=n([n=0]+i=1nfidpni)xn=1+n=1(i=1nfidpni)xn=1+n(i=0nfidpni)xn//=1+A(x)F(x)

我们知道F(x)=x1xx2,所以有

A(x)=11F(x)=1+x12xx2=1+122(11(1+2)x11(12)x)=1+n122[(1+2)n(12)n]

所以

Ansn=(1+2)n(12)n22

发现题目要求Ansn(mod1e9+7),枚举可得5971360022(mod1e9+7) ,所以259713600(mod1e9+7)

于是我们在O(logn)的时间内求得了答案!

问题来了:为什么数据范围只有106呢?我O(logn)快速幂还没有O(n)递推快……

代码:

#include<bits/stdc++.h>
namespace my_std{
    using namespace std;
    #define pii pair<int,int>
    #define fir first
    #define sec second
    #define MP make_pair
    #define rep(i,x,y) for (int i=(x);i<=(y);i++)
    #define drep(i,x,y) for (int i=(x);i>=(y);i--)
    #define go(x) for (int i=head[x];i;i=edge[i].nxt)
    #define sz 101010
    #define mod (int)(1e9+7)
    typedef long long ll;
    template<typename T>
    inline void read(T& t)
    {
        t=0;char f=0,ch=getchar();
        double d=0.1;
        while(ch>'9'||ch<'0') f|=(ch=='-'),ch=getchar();
        while(ch<='9'&&ch>='0') t=t*10+ch-48,ch=getchar();
        if(ch=='.')
        {
            ch=getchar();
            while(ch<='9'&&ch>='0') t+=d*(ch^48),d*=0.1,ch=getchar();
        }
        t=(f?-t:t);
    }
    template<typename T,typename... Args>
    inline void read(T& t,Args&... args){read(t); read(args...);}
    void file()
    {
        #ifndef ONLINE_JUDGE
        freopen("a.txt","r",stdin);
        #endif
    }
//	inline ll mul(ll a,ll b){ll d=(ll)(a*(double)b/mod+0.5);ll ret=a*b-d*mod;if (ret<0) ret+=mod;return ret;}
}
using namespace my_std;

const ll sqrt2=59713600;
ll ksm(ll x,int y)
{
    ll ret=1;
    for (;y;y>>=1,x=x*x%mod) if (y&1) ret=ret*x%mod;
    return ret;
}
ll inv(ll x){return ksm(x,mod-2);}
int n;

int main()
{
    file();
    read(n);
    cout<<(ksm(1+sqrt2,n)-ksm(mod+1-sqrt2,n)+mod)%mod*inv(2*sqrt2)%mod;
}
posted @   p_b_p_b  阅读(355)  评论(1编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示