• Educational Codeforces Round 60 (Rated for Div. 2)D(思维,DP,快速幂)


    #include <bits/stdc++.h>
    using namespace std;
    const long long mod = 1e9+7;
    unordered_map<long long,long long>mp;
    long long n,m;
    long long dp(long long n){
        if(n<0)
            return 0;
        if(n<m)
            return 1;
        if(mp.find(n)!=mp.end())//已经存在过mp[n]的话返回就完事了
            return mp[n];
        long long mid=n/2;//二分
        long long tot=dp(mid)*dp(n-mid)%mod;//一半的每种情况都可以对应另一半的任意一种情况所以可以分解为两半相乘
        for(long long i=1;i<m;i++)//dp[n]=dp[n-1]+dp[n-m],状态转移的灵感来源
            tot=(tot+dp(mid-i)*dp(n-m-(mid-i))%mod)%mod;//n-m到n这一段的组合情况
        mp[n]=tot;//更新
        return mp[n];
    }
    int main(){
     scanf("%lld%lld",&n,&m);
     mp[0]=0;
     mp[1]=1;
     printf("%lld",dp(n));
     return 0;
    }

    保持热爱 不懈努力 不试试看怎么知道会失败呢(划掉) 世上无难事 只要肯放弃(划掉)
  • 相关阅读:
    nopCommerce 2.60 之实现产品规格属性分组筛选
    chromedriver的使用
    linux 服务器发现了挖矿病毒
    C++day11 学习笔记
    C++day08 学习笔记
    C++day10 学习笔记
    C++day07 学习笔记
    C++day06 学习笔记
    C++day04 学习笔记
    C++day02 学习笔记
  • 原文地址:https://www.cnblogs.com/ldudxy/p/10496453.html
Copyright © 2020-2023  润新知