【数位dp】bzoj3209: 花神的数论题
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(组合数)题。
但是这题结合了很多出题人的恶意,并且具有一定的启示作用。
#include<bits/stdc++.h>
const int MO = ; int ans,pre;
int f[][];
int digit[];
long long n; int qmi(int a, int b)
{
int ret = ;
while (b)
{
if (b&) ret = 1ll*ret*a%MO;
a = 1ll*a*a%MO;
b >>= ;
}
return ret;
}
int main()
{
scanf("%lld",&n);
f[][] = , ans = ;
for (n++; n; n>>=) digit[++digit[]] = n&;
for (int i=; i<=digit[]; i++)
{
f[i][] = ;
for (int j=; j<=i; j++)
f[i][j] = f[i-][j]+f[i-][j-]; //预处理组合数
}
for (int i=digit[]; i; i--)
if (digit[i]){
for (int j=i-; j>=; j--)
ans = 1ll*ans*qmi(pre+j, f[i-][j])%MO;
pre++;
}
printf("%d\n",ans);
return ;
}
最初会自然地想到上面这种dp方法。
但是!这里的细节显然崩坏了。
二进制拆分
int digit[];
二进制拆分时候$digit[]$干嘛开这么小啊……注意要大概开个三倍。
组合数取模
for (int i=; i<=digit[]; i++)
{
f[i][] = ;
for (int j=; j<=i; j++)
f[i][j] = f[i-][j]+f[i-][j-];
}
这里组合数不取模显然是会溢出的。但是,重点是取什么模呢?可能会不假思索地%1e7+7,然而实际上1e7+7并不是一个素数,所以这里要回到欧拉定理
,我们有$φ(1e7+7)=9988440$。再者就是注意这里只有组合数需要对$φ(1e7+7)$取模。
溢出会RE;或是莫名其妙TLE。
dp的转移
for (int i=digit[]; i; i--)
if (digit[i]){
for (int j=i-; j>=; j--)
ans = 1ll*ans*qmi(pre+j, f[i-][j])%MO;
pre++;
}
注意到这里内层的$j>=1$,但是由于后面的元素可以不选,事实上$j$应该$>=0$才对。
手调时候会发现当$j=0,pre=0$时,$ans$就等于0了。
所以还要在快速幂里特判一层: if (!a) return ; 。
正确代码
#include<bits/stdc++.h>
const int MO = ; int ans,pre;
int f[][];
int digit[];
long long n; int qmi(int a, int b)
{
if (!a) return ;
int ret = ;
while (b)
{
if (b&) ret = 1ll*ret*a%MO;
a = 1ll*a*a%MO;
b >>= ;
}
return ret;
}
int main()
{
scanf("%lld",&n);
f[][] = , ans = ;
for (n++; n; n>>=) digit[++digit[]] = n&;
for (int i=; i<=digit[]; i++)
{
f[i][] = ;
for (int j=; j<=i; j++)
f[i][j] = (f[i-][j]+f[i-][j-])%;
}
for (int i=digit[]; i; i--)
if (digit[i]){
for (int j=i-; j>=; j--)
ans = 1ll*ans*qmi(pre+j, f[i-][j])%MO;
pre++;
}
printf("%d\n",ans);
return ;
}
END
【数位dp】bzoj3209: 花神的数论题的更多相关文章
- BZOJ3209 花神的数论题 【组合数学+数位DP+快速幂】*
BZOJ3209 花神的数论题 Description 背景 众所周知,花神多年来凭借无边的神力狂虐各大 OJ.OI.CF.TC …… 当然也包括 CH 啦. 描述 话说花神这天又来讲课了.课后照例有 ...
- [bzoj3209]花神的数论题_数位dp
花神的数论题 bzoj-3209 题目大意:sum(i)表示i的二进制表示中1的个数,求$\prod\limits_{i=1}^n sum(i)$ 注释:$1\le n\le 10^{15}$. 想法 ...
- [Bzoj3209]花神的数论题(数位dp)
3209: 花神的数论题 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2633 Solved: 1182[Submit][Status][Disc ...
- BZOJ3209: 花神的数论题(数位DP)
题目: 3209: 花神的数论题 解析: 二进制的数位DP 因为\([1,n]\)中每一个数对应的二进制数是唯一的,我们枚举\(1\)的个数\(k\),计算有多少个数的二进制中有\(k\)个\(1\) ...
- [BZOJ3209]花神的数论题 组合数+快速幂
3209: 花神的数论题 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2498 Solved: 1129[Submit][Status][Disc ...
- bzoj3209 花神的数论题——数位dp
题目大意: 花神的题目是这样的 设 sum(i) 表示 i 的二进制表示中 1 的个数.给出一个正整数 N ,花神要问你 派(Sum(i)),也就是 sum(1)—sum(N) 的乘积. 要对1000 ...
- [bzoj3209][花神的数论题] (数位dp+费马小定理)
Description 背景众所周知,花神多年来凭借无边的神力狂虐各大 OJ.OI.CF.TC …… 当然也包括 CH 啦.描述话说花神这天又来讲课了.课后照例有超级难的神题啦…… 我等蒟蒻又遭殃了. ...
- bzoj3209 花神的数论题 (二进制数位dp)
二进制数位dp,就是把原本的数字转化成二进制而以,原来是10进制,现在是二进制来做,没有想像的那么难 不知到自己怎么相出来的...感觉,如果没有一个明确的思路,就算做出来了,也并不能锻炼自己的能力,因 ...
- BZOJ3209 花神的数论题
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...
随机推荐
- Validation(2)
站在巨人的肩膀上 spring注解式参数校验 2016年06月15日 15:42:47 God_Ming 阅读数:57021 标签: springhibernatevalidator 更多 个人分类: ...
- 可以提升3倍开发效率的 Intellij IDEA快捷键大全汇总(2019)
整理了一下IDEA的常用快捷键,可以打印出来或者弄成图片设置为桌面,为广大的程序员们节省更多的时间去谈恋爱. 常用快捷键1 Ctrl+Shift + Enter,语句完成 “!”,否定完成,输入表达式 ...
- python如何用pip安装模块
pip去python官网下载 我想写的是安装后怎么做,假设我们要安装pymysql模块 在python交互式模式中运行pip install pymysql 会抛出 语法错误,不知为何. 此时应该找到 ...
- 设置DataTable行属性
dt.Columns["ColumnName"].DataType=Type.GetType("System.bool");
- 相册选择头像或者拍照 上传头像以NSData 图片二进制格式 表单上传
一.点击头像图片 或者按钮 在相册选择照片返回img,网络上传头像要用data表单上传 (1)上传头像属性 // 图片二进制格式 表单上传 @property (nonatomic, strong) ...
- Codeforces 1142A(性质、暴举)
队友和大佬都什么几种情况啥的……我是把终点都插了,起点随便选一个,暴举答案莽A. ; ll n, k, a, b, aa, minn = INF, maxx = -; set<ll> bb ...
- 542 01 Matrix 01 矩阵
给定一个由 0 和 1 组成的矩阵,找出每个元素到最近的 0 的距离.两个相邻元素间的距离为 1 .示例 1:输入:0 0 00 1 00 0 0输出:0 0 00 1 00 0 0 示例 2:输入: ...
- Parenthesis UVALive - 4882 删除不必要的括号序列,模拟题 + 数据
https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...
- odoo8 报表页面修改和字体设置
版本8.0, 想要发票修改报表页眉的内容,去公司设置下修改,返现无论如何也不生效. 放狗后得知: You probably already know that you can customise th ...
- python_18(Django基础)
第1章 web框架的本质 1.1 socket 1.2 空格后面是主体内容 1.3 HTTP协议 1.3.1 响应流程 1.4 HTTP请求方法 1.5 HTTP工作原理 1.6 URL 1.7 HT ...