设为首页 加入收藏

TOP

[数位dp] bzoj 3209 花神的数论题
2015-07-20 17:39:05 来源: 作者: 【 】 浏览:3
Tags:[数位 bzoj 3209 花神 论题

题意:中文题。

思路:和普通数位dp一样,这里转换成二进制,然后记录有几个一,

统计的时候乘起来就好了。

代码:

#include"cstdlib"
#include"cstdio"
#include"cstring"
#include"cmath"
#include"stack"
#include"algorithm"
#include"iostream"
using namespace std;
long long dp[66][66];
int m=10000007;
int num[66];
long long dfs(int site,int n,int f)
{
    if(site==0) return n?n:1;      //注意是乘积,所以0个1的时候返回1
    if(!f&&dp[site][n]!=-1) return dp[site][n];
    int len=f?num[site]:1;
    long long ans=1;  //ans 的初值是1
    for(int i=0;i<=len;i++)
    {
        if(i==0) ans*=dfs(site-1,n,f&&i==len);
        else ans*=dfs(site-1,n+1,f&&i==len);
        if(ans>=m) ans%=m;
    }
    if(!f) dp[site][n]=ans%m;
    return ans%m;
}
long long solve(long long x)
{
    int cnt=0;
    while(x)
    {
        num[++cnt]=x%2;
        x/=2;
    }
    return dfs(cnt,0,1)%m;
}
int main()
{
    long long n;
    memset(dp,-1,sizeof(dp));
    while(scanf("%lld",&n)!=-1)
    {
        printf("%lld\n",solve(n));
    }
    return 0;
}


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇HDU 3507 Print Article (斜率优.. 下一篇(十四)unity4.6学习Ugui中文文..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·「链表」是一种怎样 (2025-12-25 19:20:51)
·C 语言中的链表有哪 (2025-12-25 19:20:48)
·c语言中的链表怎么学 (2025-12-25 19:20:45)
·Redis 分布式锁全解 (2025-12-25 17:19:51)
·SpringBoot 整合 Red (2025-12-25 17:19:48)