bzoj3209
首先这道题目不难想到将答案转化为这种形式
2^s[2]*3*s[3]*…max*s[max]
这时候我们要分类讨论,设n的二进制位数为t
当1~n中二进制位数小于t时
我们可以直接用组合的知识,二进制有i个1一共有c(t-1,i)
当1~n中二进制位数等于t时
我们数位统计一下即可,具体的当第i位为1时,(从右往左标)
后面i-1位01情况随意,即s[j+s]=s[j+s]+c(i-1,j) (s为到第i位n所含1的个数(不包括第i位),0<=j<=i-1)
当第i位为0,不管他……
最后用一下快速幂即可
const mo=; var c:array[..,..] of int64;
sum:array[..] of int64;
b:array[..] of int64;
i,j:longint;
n,s,p,t,ans:int64; function quick(x,y:int64):int64;
var i:longint;
m:int64; begin
m:=;
while x<> do
begin
inc(m);
b[m]:=x mod ;
x:=x div ;
end;
quick:=y;
for i:=m- downto do
begin
quick:=quick*quick mod mo;
if b[i]= then quick:=quick*y mod mo;
end;
end; begin
c[,]:=;
for i:= to do
begin
c[i,]:=;
c[i,i]:=;
for j:= to i- do
c[i,j]:=c[i-,j]+c[i-,j-];
end;
readln(n);
t:=trunc(ln(n)/ln())+;
for i:= to t- do
sum[i]:=c[t-,i];
t:=;
while n<> do
begin
inc(t);
b[t]:=n mod ;
n:=n div ;
end;
s:=;
for i:=t- downto do
if b[i]= then
begin
for j:= to i- do
sum[j+s]:=sum[j+s]+c[i-,j];
s:=s+;
end; sum[s]:=sum[s]+; //还有n这个数要统计
ans:=;
for i:= to t do
if sum[i]<> then
ans:=ans*quick(sum[i],i) mod mo;
writeln(ans);
end.
bzoj3209的更多相关文章
- BZOJ3209 花神的数论题 【组合数学+数位DP+快速幂】*
BZOJ3209 花神的数论题 Description 背景 众所周知,花神多年来凭借无边的神力狂虐各大 OJ.OI.CF.TC …… 当然也包括 CH 啦. 描述 话说花神这天又来讲课了.课后照例有 ...
- 【BZOJ3209】花神的数论题 数位DP
[BZOJ3209]花神的数论题 Description 背景众所周知,花神多年来凭借无边的神力狂虐各大 OJ.OI.CF.TC …… 当然也包括 CH 啦.描述话说花神这天又来讲课了.课后照例有超级 ...
- 【bzoj3209】: 花神的数论题 数论-DP
[bzoj3209]: 花神的数论题 首先二进制数中1的个数最多就是64个 设所有<=n的数里二进制中1的个数为i的有a[i]个 那么答案就是 然后快速幂 求a[i]可以用DP 设在二进制中从 ...
- [bzoj3209]花神的数论题_数位dp
花神的数论题 bzoj-3209 题目大意:sum(i)表示i的二进制表示中1的个数,求$\prod\limits_{i=1}^n sum(i)$ 注释:$1\le n\le 10^{15}$. 想法 ...
- BZOJ3209 花神的数论题
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...
- bzoj3209 花神的数论题 (二进制数位dp)
二进制数位dp,就是把原本的数字转化成二进制而以,原来是10进制,现在是二进制来做,没有想像的那么难 不知到自己怎么相出来的...感觉,如果没有一个明确的思路,就算做出来了,也并不能锻炼自己的能力,因 ...
- bzoj3209 花神的数论题——数位dp
题目大意: 花神的题目是这样的 设 sum(i) 表示 i 的二进制表示中 1 的个数.给出一个正整数 N ,花神要问你 派(Sum(i)),也就是 sum(1)—sum(N) 的乘积. 要对1000 ...
- 2018.10.27 bzoj3209: 花神的数论题(数位dp)
传送门 数位dpdpdp经典题. 题面已经暗示了我们按照二进制位来数位dpdpdp. 直接dpdpdp多少个数有111个111,222个111,333个111-, 然后快速幂算就行了. 于是我们枚举前 ...
- 【bzoj3209】 花神的数论题
http://www.lydsy.com/JudgeOnline/problem.php?id=3209 (题目链接) 题意 ${sum(i)}$表示${i}$的二进制表示中${1}$的个数.求${\ ...
随机推荐
- 256MB小内存MySQL配置优化
[client] port = 3306 socket = /var/run/mysqld/mysqld.sock [mysqld_safe] socket = /var/run/mysqld/mys ...
- C语言基础知识小总结(2)
上个总结比较笼统,下面写的稍微详细点吧算是. 一.控制台屏幕打印 1.putchar(); 格式: void putchar(char c); //直接把一个字符输出到屏幕上 2.print ...
- WEB 中的一些名词解释
OOP: 面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)是一种计算机编程架构. AOP: AOP为Aspect Oriented Programmin ...
- c语言学习之基础知识点介绍(六):if和switch结构
本节主要说c语言中的分支结构. c语言中分支结构有两大类:一种是if,一种是switch. 一.if结构 //if结构,语法: //第一种: if(表达式){ //语句块 } //第二种: if(表达 ...
- QVW中实现日期区间的选择功能!
QV在日期的选择上不是很灵活,日期区段的选择可以在列表框中直接用鼠标拖拉区段,如果跨周期比较长了还是不是很方便啦. 下面介绍的方式是完全实现了起始日期的选择功能. 注:日期这个字段在抽取的时候一定要格 ...
- SQL SERVER while循环
在SQL数据库中,可以通过WHILE实现循环,下面就将为您介绍SQL循环执行while控制,希望对您提升WHILE的使用水平能够有些帮助. WHILE Boolean_expression { ...
- Ubuntu常用终端快捷键
CTRL+k:删除从光标到行尾的部分 CTRL+u:删除从光标到行首的部分 ALT+d:删除从光标到当前单词结尾的部分 CTRL+w:删除从光标到当前单词开头的部分 CTRL+a:将光标移到行首 CT ...
- 【html】【0】开始的序言
人生总得做点什么才显得有意义,在牛逼的梦想也抵挡不住你傻逼似的坚持! 1>本系列适用于没有任何计算机语言基础的小白入门级教程 2>为了我喜欢的一个女生小娜娜 3>为自己系统的学习ht ...
- JDBC连接池以及动态SQL处理
复习一下: 1.先创建一个properties配置文件 ClasssName=oracle.jdbc.driver.OracleDriver url=jdbc:oracle:thin:@服务器IP:端 ...
- UVA 11825 Hackers’ Crackdown(集合动态规划 子集枚举)
Hackers’ Crackdown Miracle Corporations has a number of system services running in a distributed com ...