博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[bzoj3209]花神的数论题
阅读量:4981 次
发布时间:2019-06-12

本文共 1356 字,大约阅读时间需要 4 分钟。

来自FallDream的博客,未经允许,请勿转载,谢谢,


 

背景

众所周知,花神多年来凭借无边的神力狂虐各大 OJ、OI、CF、TC …… 当然也包括 CH 啦。
描述
话说花神这天又来讲课了。课后照例有超级难的神题啦…… 我等蒟蒻又遭殃了。
花神的题目是这样的
设 sum(i) 表示 i 的二进制表示中 1 的个数。给出一个正整数 N ,花神要问你
派(Sum(i)),也就是 sum(1)—sum(N) 的乘积取膜10^7+7的值。

n<=10^15

感觉别人的题解写的非常有道理 可以数位dp+快速幂   讲讲我的乱搞吧

二进制位数不同的分开看 发现是

1

12

1223

....

每一个长度的所有数字的sum其实就是前一个搬过来,再接上一个加上一的。

然后就可以乱搞了呗 预处理每个长度之后,先1248这样的加上去,最后剩下一个不完整的段,可以根据这个规律表示成少一位的一个不完整的段加上最多一个完整的段,递归的时候记一下后移了多少位即可。

复杂度是logn^2+logn

然后这个膜数不是质数 真的坑

#include
#include
#define mod 10000007#define MN 50#define ll long longusing namespace std;ll Ans[MN+5],s[MN+5][MN+5];ll n;void Add(int i,int Move=0){
for(int j=1;j+Move<=MN;++j) Ans[j+Move]+=s[i][j];}void Calc(int i,ll n,int ad){ if(!n) return; if(n<(1LL<<(i-1))) Calc(i-1,n,ad); else Calc(i-1,n-(1LL<<(i-1)),ad+1),Add(i,ad);}inline int pow(int x,ll k){ int sum=1; for(;k;k>>=1,x=1LL*x*x%mod) if(k&1) sum=1LL*sum*x%mod; return sum;}int main(){ s[1][1]=1; for(int i=2;i<=MN;++i) for(int j=1;j<=MN;++j) s[i][j]=s[i-1][j]+s[i-1][j-1]; scanf("%lld",&n);if(!n) return 0*puts("0"); for(int i=1;(1LL<<(i-1))<=n;n-=(1LL<<(i-1)),++i) Add(i); Calc(MN,n,0);int ans=1; for(int i=1;i<=MN;++i) ans=1LL*ans*pow(i,Ans[i])%mod; printf("%d\n",ans); return 0;}

转载于:https://www.cnblogs.com/FallDream/p/bzoj3209.html

你可能感兴趣的文章
[转]编程珠玑第五章二分搜索(折半查找)之java实现
查看>>
linux django 知识点 安装mysql数据库 和 pycharm
查看>>
Angular routing生成路由和路由的跳转
查看>>
第一周Access总结
查看>>
Project Euler欧拉计划
查看>>
yii 邮件发送
查看>>
一个翻译自VB6.0的验证码识别代码
查看>>
[UI] 精美UI界面欣赏[11]
查看>>
一个悲剧的问题,服务器控件还是少用吧
查看>>
JS总结
查看>>
UVM 之$cast
查看>>
HttpServletResponse
查看>>
Osmotic Study ----Mysql Safe
查看>>
SignalR使用笔记
查看>>
[清华集训2014]玛里苟斯(线性基+概率期望)
查看>>
Android屏幕density, dip等相关概念总结
查看>>
[你必须知道的.NET]第十五回:继承本质论
查看>>
.net 分布式架构之任务调度平台
查看>>
理解Linux系统负荷
查看>>
angular 初学(二)ng-class ng-disabled
查看>>