[BZOJ 3209]花神的数论题
一道简单的数位 dp 题
但是脑子里只有 __builtin_popcountll 了呢(自重)
看完题解后很快就理解了,而且有一种这么简单的题居然没想到做法真是不应该唉~的感觉
用 f[i] 表示 1 的位数为 i 且小于 n 的数的个数
然后答案就是 Πif[i] ,而 f[i] 的话从高到低 dp 用组合数乱搞搞一下就可以了 O((lgn)2)
比如说前 i-1 位有 k 位 1 ,第 i 位是 1 ,后面还有 j 位数
然后令第 i 位取 0 ,那么无论后 j 位取了什么数,都比 n 小,用组合数来更新 f[k+l] (0<=l<=j) 即可
但是 WA 了好久噻,愕然发现 10000007 这个比赛中超常用的模数居然
不!是!质!数!
10000007=941*10627
然后用费马小定理的我就这样 biubiu~
只好边枚举边算答案
以后果然一定要注意一下了,以上
#include <cstdio>
typedef long long LL;
const int mod=;
const int size=; LL n;
LL ans;
LL c[size][size];
LL f[];
inline LL getint();
inline void putint(LL);
inline int lg(LL);
inline LL mul(LL, LL);
inline LL pow(LL, LL);
inline void calc(); int main()
{
n=getint();
ans=;
calc();
putint(ans); return ;
}
inline LL getint()
{
register LL num=;
register char ch;
do ch=getchar(); while (ch<'' || ch>'');
do num=num*+ch-'', ch=getchar(); while (ch>='' && ch<='');
return num;
}
inline void putint(LL num)
{
char stack[];
register int top=;
if (num==) stack[top=]='';
for ( ;num;num/=) stack[++top]=num%+'';
for ( ;top;top--) putchar(stack[top]);
putchar('\n');
}
inline int lg(LL x)
{
int ret=;
for ( ;x>;x>>=) ret++;
return ret;
}
inline LL mul(LL a, LL b)
{
return a*b%mod;
}
inline LL pow(LL a, LL b)
{
LL c=;
for ( ;b;b>>=)
{
if (b & ) c=mul(c, a);
a=mul(a, a);
}
return c;
}
inline void calc()
{
for (int i=;i<;i++)
{
c[i][]=;
for (int j=;j<i;j++)
c[i][j]=c[i-][j-]+c[i-][j];
c[i][i]=;
}
int k=;
for (int i=lg(n);i>=;i--) if ((n>>i) & )
{
ans=mul(ans, k+);
for (int j=;j<=i;j++)
ans=mul(ans, pow(k+j, c[i][j]));
++k;
}
}
本傻 WA 出翔系列
[BZOJ 3209]花神的数论题的更多相关文章
- BZOJ 3209: 花神的数论题 [数位DP]
3209: 花神的数论题 题意:求\(1到n\le 10^{15}\)二进制1的个数的乘积,取模1e7+7 二进制最多50位,我们统计每种1的个数的数的个数,快速幂再乘起来就行了 裸数位DP..\(f ...
- [BZOJ 3209] 花神的数论题 【数位统计】
题目链接: BZOJ - 3209 题目大意 设 f(x) 为 x 的二进制表示中 1 的个数.给定 n ,求 ∏ f(i) (1 <= i <= n) . 题目分析 总体思路是枚 ...
- bzoj 3209 花神的数论题 —— 数位DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3209 算是挺简单的数位DP吧,但还是花了好久才弄明白... 又参考了博客:https://b ...
- bzoj 3209 花神的数论题——二进制下的数位dp
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3209 可以枚举 “1的个数是...的数有多少个” ,然后就是用组合数算在多少位里选几个1. ...
- BZOJ 3209 花神的数论题 数位DP+数论
题目大意:令Sum(i)为i在二进制下1的个数 求∏(1<=i<=n)Sum(i) 一道非常easy的数位DP 首先我们打表打出组合数 然后利用数位DP统计出二进制下1的个数为x的数的数量 ...
- BZOJ 3209: 花神的数论题【数位dp】
Description 背景众所周知,花神多年来凭借无边的神力狂虐各大 OJ.OI.CF.TC …… 当然也包括 CH 啦.描述话说花神这天又来讲课了.课后照例有超级难的神题啦…… 我等蒟蒻又遭殃了. ...
- [数位dp] bzoj 3209 花神的数论题
题意:中文题. 思路:和普通数位dp一样,这里转换成二进制,然后记录有几个一. 统计的时候乘起来就好了. 代码: #include"cstdlib" #include"c ...
- bzoj3209:3209: 花神的数论题
觉得还是数位dp的那种解题形式但是没有认真的想,一下子就看题解.其实还是设置状态转移.一定要多思考啊f[i][j]=f[i-1][j]+g[i-1][j] g[i][j]=f[i-1][j-1]+g[ ...
- 【BZOJ】3209: 花神的数论题
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3209 显然是按照二进制位进行DP. 考虑预处理$F[i][j]$表示到了二进制的第$i$位 ...
随机推荐
- (原创)Windows和Linux间共享文件
方法一: Windows创建目录sharedir,修改共享属性,对everyone开放读写权限. Linux下运行命令:# mount -t cifs //192.168.8.55/sharedir ...
- Trick
1. var b = a.slice(beginIndex,endIndex); [].slice.call( [] ) Array.prototype.slice.call([]) will cop ...
- [WebLoad] 使用WebLoad进行Web Application 性能测试的流程
1. 打开WebLOAD IDE录制或编写一个脚本文件,成功后会生成一个后缀为“.wlp”的文件. 2. 打开WebLOAD Console创建一个Load Template,创建过程当中需要添加“. ...
- Nosql modifing...
关键字补充(不晓得的自己去Google): 负载均衡 \文件上传到服务器\建表建动态列簇\数据仓库的应用\事务的提交和回滚\SQL执行计划\联机事务处理\联机分析处理\多表关联查询\数据存储引擎 N ...
- git删除远程仓库的某次错误提交
改日写git的各种本地恢复 今天不小心把一个分支合并到master上了,上网查了一下回复的方法,简单来说就是: 在本地 把远程的master分支删除再把reset后的分支内容给push上去 新建old ...
- javascript 特殊的一些知识
基础知识 1.注释/**/ 块注释,与正则表达式有冲突,不安全. 2.js数字类型只有一个,即为64位的浮动值 3.NaN是一个数值,他不能产生正常结果的运算结果.NaN不等于任何值,包括它自己.is ...
- cookie包含中文导致的问题
周五项目测试完毕没问题之后上线,上线之后发现有的账户登录不上 原因为,用来记录追踪用户的cookie中包含cookie.读取,写入时候发生异常. 异常大概是这个样子: java.lang.Illega ...
- ios打包
ios7.1及以上 itms-services://?spm=0.0.0.0.WIsvD2&action=download-manifest&url=https://mtl.aliba ...
- ionic 安装本地插件极光推送
问题:按照官方文档的步骤 假如把插件保存到了D:\push\jpush,当执行到 cordova plugin add D:\push\jpush 的时候,ionic 不是从本地目录安装,而是从reg ...
- bzoj 3109: [cqoi2013]新数独
#include<cstdio> #include<iostream> using namespace std; ][],li[][],xi[][],a[][],bh[][], ...