博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[bzoj3209]花神的数论题
阅读量:4973 次
发布时间: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

你可能感兴趣的文章
给js文件传参数
查看>>
leetcode[155]Min Stack
查看>>
Gson 解析教程
查看>>
创建多线程方式一(继承Thread类)
查看>>
FTP服务(1)
查看>>
使用webSocket实现群聊
查看>>
Ubuntu系统下通过Clang编译器编写Objective-C
查看>>
Eclipse快捷键大全
查看>>
进程通信之消息队列
查看>>
和Excel函数date同样功能的VBA函数DateSerial用法
查看>>
vue的v-for数组和对象
查看>>
AI R-CNN目标检测算法
查看>>
iOS7: 如何获取不变的UDID
查看>>
CentOS环境PHP安装memcache扩展
查看>>
频率与Hold Time,gitter与Hold Time
查看>>
SQLServer数据库中开启CDC导致“事务日志空间被占满,原因为REPLICATION”的原因分析和解决办法...
查看>>
WPF生成二维码
查看>>
索引最左列特征的一点认识
查看>>
仿淘宝、京东首页图片广告垂直滑动
查看>>
GPIO
查看>>