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


设f[i][j]表示所有i位数中1的个数为j的数的个数。

然后发现这是组合数,相当于i个数中选j个。

然后数位DP求出每个数在答案中出现了多少次。

乘起来即可。

代码:

#include <cstdio>
#include <string.h>
#include <algorithm>
using namespace std;
typedef long long ll;
const ll mod=10000007;
ll c[150][150],n,cnt[150];
ll qp(ll x,ll y) {
ll re=1;for(;y;y>>=1ll,x=x*x%mod) if(y&1ll) re=re*x%mod; return re;
}
int main() {
int i,j;
for(i=0;i<=60;i++) c[i][0]=c[i][i]=1;
for(i=1;i<=60;i++) {
for(j=1;j<i;j++) {
c[i][j]=c[i-1][j]+c[i-1][j-1];
}
}
scanf("%lld",&n); n++;
int now=0;
for(i=60;i>=1;i--) {
// printf("%d",(n&(1ll<<(i-1)))!=0);
if(!(n&(1ll<<(i-1)))) continue;
for(j=1;j<=60;j++) {
if(j>=now&&j-now<=i-1) cnt[j]+=c[i-1][j-now];
}
now++;
}
// puts("");
ll ans=1;
for(i=1;i<=60;i++) {
// printf("%lld\n",cnt[i]);
ans=ans*qp(i,cnt[i])%mod;
}
printf("%lld\n",ans);
}

最新文章

  1. N-Queens
  2. Java并发编程基础--基本线程方法详解
  3. jQuery页面滚动右侧浮动导航切换
  4. JS魔法堂:ES6新特性——GeneratorFunction介绍
  5. 用JS做关灯游戏(初级)
  6. elasticsearch rpm 安装
  7. arcgis如何制作DEM数据
  8. JS原生第四篇 (帅哥)
  9. ARP协议工作流程
  10. (转) IOS用CGContextRef画各种图形(文字、圆、直线、弧线、矩形、扇形、椭圆、三角形、圆角矩形、贝塞尔曲线、图片)
  11. 容联云通讯_提供网络通话、视频通话、视频会议、云呼叫中心、IM等融合通讯能力开放平台。
  12. IOS设计模式之三:MVC模式
  13. grep 查找当前文件夹下所有文件内内容 并显示文件名
  14. 基于VUE框架 与 其他框架间的基本对比
  15. 【python 3】 字符串方法操作汇总
  16. jq文件上传及下载
  17. 快速切题 sgu118. Digital Root 秦九韶公式
  18. 异步模型(APM)的注意事项
  19. gpu和cpu区别
  20. Shell 命令行,实现对若干网站状态批量查询是否正常的脚本

热门文章

  1. PTA 03-树2 List Leaves (25分)
  2. kafka直连方式消费多个topic
  3. bzoj 3786 星系探索 dfs+splay
  4. ng-repeat的作用域问题
  5. Tsinghua OJ Zuma
  6. 【POJ1743】Musical Theme(后缀数组,二分)
  7. C# 通过T4自动生成代码
  8. Java中的数字
  9. how to read openstack code: request extension
  10. DATASNAP清除僵死连接