BZOJ 3209: 花神的数论题【数位dp】
Description
背景
众所周知,花神多年来凭借无边的神力狂虐各大 OJ、OI、CF、TC …… 当然也包括 CH 啦。
描述
话说花神这天又来讲课了。课后照例有超级难的神题啦…… 我等蒟蒻又遭殃了。
花神的题目是这样的
设 sum(i) 表示 i 的二进制表示中 1 的个数。给出一个正整数 N ,花神要问你
派(Sum(i)),也就是 sum(1)—sum(N) 的乘积。
Input
一个正整数 N。
Output
一个数,答案模 10000007 的值。
Sample Input
样例输入一
3
Sample Output
样例输出一
2
HINT
对于样例一,1*1*2=2;
数据范围与约定
对于 100% 的数据,N≤10^15
思路:数位dp,计算小于n并且sum(i)=k的i有多少个,设为u,则答案为pow(k,u),然后枚举k即可
#include<cstdio>
#include<iostream>
#include<cstring>
#include<map>
#define maxn 1000005
#define MOD 10000007
using namespace std;
long long num[maxn],h=0,dp[100][100][100][2];
long long dfs(long long pos,long long need,long long now,long long limit)
{
if(pos==0)return now==need;
int tmp=limit?num[pos]:1;
long long ans=0;
if(!limit&&dp[pos][need][now][limit]!=-1)
return dp[pos][need][now][limit];
for(int i=0;i<=tmp;i++)
{
ans=(ans+dfs(pos-1,need,now+i,limit&&(i==tmp)));
}
if (!limit)
dp[pos][need][now][limit]=ans;
return ans;
}
long long mpow(long long a,long long n)
{
long long ans=1;
a%=MOD;
while (n)
{
if (n%2) ans=(ans%MOD)*(a%MOD)%MOD;
n/=2;
a=(a%MOD)*(a%MOD)%MOD;
}
return ans;
}
int main()
{
long long n;
memset(dp,-1,sizeof(dp));
while(scanf("%lld",&n)!=EOF)
{
long long ans=1;h=0;
if(n==0){printf("0\n");continue;}
while(n>0){num[++h]=n&1;n>>=1;}
for(int i=1;i<=h;i++)
{
long long u=dfs(h,i,0,1);
long long v=mpow((long long)i,u%9988440+9988440);
ans=((ans%MOD)*(v%MOD))%MOD;
if(ans==6296768)
{
int zz=1;
}
}
printf("%lld\n",ans);
}
return 0;
}
BZOJ 3209: 花神的数论题【数位dp】的更多相关文章
- BZOJ 3209: 花神的数论题 [数位DP]
3209: 花神的数论题 题意:求\(1到n\le 10^{15}\)二进制1的个数的乘积,取模1e7+7 二进制最多50位,我们统计每种1的个数的数的个数,快速幂再乘起来就行了 裸数位DP..\(f ...
- bzoj 3209 花神的数论题 —— 数位DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3209 算是挺简单的数位DP吧,但还是花了好久才弄明白... 又参考了博客:https://b ...
- BZOJ 3209 花神的数论题 数位DP+数论
题目大意:令Sum(i)为i在二进制下1的个数 求∏(1<=i<=n)Sum(i) 一道非常easy的数位DP 首先我们打表打出组合数 然后利用数位DP统计出二进制下1的个数为x的数的数量 ...
- BZOJ3209: 花神的数论题(数位DP)
题目: 3209: 花神的数论题 解析: 二进制的数位DP 因为\([1,n]\)中每一个数对应的二进制数是唯一的,我们枚举\(1\)的个数\(k\),计算有多少个数的二进制中有\(k\)个\(1\) ...
- 【BZOJ3209】花神的数论题 数位DP
[BZOJ3209]花神的数论题 Description 背景众所周知,花神多年来凭借无边的神力狂虐各大 OJ.OI.CF.TC …… 当然也包括 CH 啦.描述话说花神这天又来讲课了.课后照例有超级 ...
- bzoj 3209 花神的数论题——二进制下的数位dp
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3209 可以枚举 “1的个数是...的数有多少个” ,然后就是用组合数算在多少位里选几个1. ...
- [数位dp] bzoj 3209 花神的数论题
题意:中文题. 思路:和普通数位dp一样,这里转换成二进制,然后记录有几个一. 统计的时候乘起来就好了. 代码: #include"cstdlib" #include"c ...
- [BZOJ 3209] 花神的数论题 【数位统计】
题目链接: BZOJ - 3209 题目大意 设 f(x) 为 x 的二进制表示中 1 的个数.给定 n ,求 ∏ f(i) (1 <= i <= n) . 题目分析 总体思路是枚 ...
- bzoj3209 花神的数论题——数位dp
题目大意: 花神的题目是这样的 设 sum(i) 表示 i 的二进制表示中 1 的个数.给出一个正整数 N ,花神要问你 派(Sum(i)),也就是 sum(1)—sum(N) 的乘积. 要对1000 ...
随机推荐
- OpenStack安装keyston 错误BError: (pymysql.err.InternalError) (1071, u‘Specified key was too long; max key length is 767 bytes‘) [SQL: u‘\nCREATE TABLE migrate_ver
折腾了两天的错误,BError: (pymysql.err.InternalError) (1071, u‘Specified key was too long; max key length is ...
- MAC进入文件夹快捷键
common + O common+up common+Down shift + common +G
- CPP-基础:C++中为什么需要一个头文件,一个cpp文件
把文件分成头文件和源文件完全是为了方便扩展和组织程序 这么说吧 我们可能会自定义很多函数 而这些函数分别会在不同的地方被调用 甚至有些时候我们需要把一堆函数打包起来一起调用 比如#include &q ...
- Hibernate 多表查询 - Criteria添加子字段查询条件 - 出错问题解决
Criteria 查询条件如果是子对象中的非主键字段会报 could not resolve property private Criteria getCriteria(Favorite favori ...
- prototype中的ajax异步加载
jquery前台处理: var param = {a:a}; $.post("*.do",param,function(data) { var columHtml = " ...
- urlrewrite地址重写实例
urlrewrite主要实现后天请求中的地址重写,防止被安全漏洞盲注入 http://tuckey.org/urlrewrite/ 下载最新的jar 下面是使用说明: 1.下载urlrewrite,官 ...
- Bootstrap历练实例:带有下拉菜单的标签和胶囊导航
<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...
- bootstrap历练实例: 基本胶囊式的导航菜单
<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...
- Vue构建项目
构建Vue项目 按照官网教程安装 //先安装脚手架 cnpm i -g vue-cli //查看项目目标列表: webpack browserify pwa 等项目模板 vue list //使用we ...
- sublime点击预览未起作用?教你如何设置支持浏览器预览
我用的text3版,其他版本未试,但应该也有效. 安了个view in browser插件,然而点击预览未起作用. 搜解决方法,发现了另一个插件,sidebar enhancements,设置快捷键预 ...