[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$位 ...
随机推荐
- json和xml数据的解析
一 json数据 1一条json就像一个对象,也想像OC中的数组,且内嵌了很多键值对字典 {"name" : "jack", "age" : ...
- [转]我为什么要学习python
我为什么要学习python 引言:学习python近两年,谈谈我对于python的一点小理解,也从一些方面谈谈自己微薄的想法,也就是我为什么学习python 这里我不讨论python的一些有用的库 ...
- MongoDB:实体对象(javabean)转DBObject
代码仅供练习(反射,泛型): package utils; import java.lang.reflect.Field; import com.mongodb.BasicDBObject; impo ...
- android log
from 点击打开链接 使用Android logcat 对我们开发.调试Android程序有很大的帮助!通过logcat,我们可以非常方便的了解到程序的执行情况,判断出错代码位置. 最简单的log ...
- Icon资源详解[2]
本文分享&备忘最近了解到的icon资源在windows平台下相关的一部分知识.所有测试代码都尽可能的依赖win32 API实现.通过源码可以了解其结构,同时它们也是可复用的代码积累. ...
- 用MySQL实现分页查询
MySQL中实现分页查询语句: //定义分页需要的变量 int pageNow=2;//当前页 int pageSize=3;//指定每页显示3条记录 int pageCount=1;//该值是计算出 ...
- WCF初探-18:WCF数据协定之KnownType
KnownTypeAttribute 类概述 在数据到达接收终结点时,WCF 运行库尝试将数据反序列化为公共语言运行库 (CLR) 类型的实例.通过首先检查传入消息选择为反序列化而实例化的类型,以确定 ...
- 使用 IN 的子查询
通过 IN(或 NOT IN)引入的子查询结果是一列零值或更多值.子查询返回结果之后,外部查询将利用这些结果. 下列查询会找到所有曾出版过商业书籍的出版商的名称. USE pubs SELECT pu ...
- 一台服务器发布多个tomcat并注册服务名办法
修改服务名称 打开Tomcat7.0.65_1/bin/service.bat 修改注册服务名称 当然这个名字自己改 比如Tomcat7_2 原始文件: set SERVICE_NAME=Tom ...
- 日常笔记 ---- 图形学-Frenel函数材质球实现方式
图形学-Frenel函数材质球实现方式 调个材质 大概公式 自发光= 自定义边光颜色* ((1-法线与视角方向点乘)的 自定义幂次方 ) 这个是比较简单方法 模型的法线与视角方向 角度越大 表 ...