原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round4-C.html

题目传送门 - https://www.nowcoder.com/acm/contest/142/C

题意

  定义

$$a_n=\begin{cases}0&\text{$(n=1)$}\\ a_{\left\lfloor\frac n2 \right\rfloor}+(-1)^{\frac{n(n+1)}2}&\text{$(n>1)$}\end{cases}$$

  现在 有 $T$ 组询问,每组询问给定一个 $n$ 让你求

$$\sum_{i=1}^{n}|a_i|$$

  $T=10^5,n\leq 10^{18}$

题解

  AC 之后查了一下别人的代码,发现居然有一份代码和我做法类似。Orz

  标算是 数位dp ,不用动什么脑子,码出来就可以了。由于博主十分的,不想写数位dp,于是瞎bb了个简单的做法,没想到真的能 AC 。顺手卡到了代码第一短和跑的第一快。

  首先,我们考虑如何得到任意 $x$ 的 $a_x$ 。不要直接代公式,我们来找找规律。我们考虑把原数写成二进制,个位为第一位。那么,假设这个数在二进制形式下有 $t$ 位,那么对于每两个连续的数位,如果他们相等,则对 $a_x$ 的贡献为 $1$ ,否则为 $-1$ 。这个很好证明的,不多说。

  预处理一下 $ans_{i,j}$ 表示后面还有 $j$ 位没有确定,而前面对答案的贡献为 $i$ 时,后面所有填法所得到的 $x$ 的 $|a_x|$ 之和。

  我们考虑枚举一下后面 $j$ 位有几位与其前一位不同。则对于每一个枚举到的值,设为 $k$ ,则可以在 $j$ 位中选择 $k$ 个让它与它的前一位相同,得到的 $a_x=i+2k-j$ ,方案总数为 $\binom{j}{k}$ ,对 $ans_{i,j}$ 的贡献为 $\binom{j}{k}\times |a_x|$ 。所以我们可以 $O(\log^3 maxn)$ 预处理这个东西。

  对于每一个 $n$ ,把它搞成二进制形式,考虑分三种情况求答案。

  第一种情况:统计的数的位数比 $n$ 小(在二进制下),则答案贡献为 $\sum_{i=1}^{d-1} ans_{0,i-1}$ 。

  第二种情况:$i$ 从高到低位枚举,当前统计的数从第 $i$ 位开始比 $n$ 小了,设 $tot$ 为比 $i$ 位高的数位以及 $i$ 本身对 $a_x$ 的贡献,则当前 $i$ 对答案的贡献为 $ans_{tot,i-1}$ 。

  第三种情况:$x=n$ ,直接把 $|a_x|$ 加到答案里就可以了。

  时间复杂度 $O(\log^3 n+ T \log n)$ 。

代码

最短和最快!

截止 2018-07-28  23:10 最快代码

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
LL read(){
LL x=0;
char ch=getchar();
while (!isdigit(ch))
ch=getchar();
while (isdigit(ch))
x=(x<<1)+(x<<3)+ch-48,ch=getchar();
return x;
}
const int N=140,_0=64,mod=1e9+7;
int C[N/2][N/2],ans[N][N/2],T,d[N],t;
LL n;
void del(int &x){
if (x>=mod)
x-=mod;
}
int main(){
for (int i=0;i<N/2;i++)
C[i][0]=1;
for (int i=1;i<N/2;i++)
for (int j=1;j<=i;j++)
C[i][j]=(C[i-1][j-1]+C[i-1][j])%mod;
for (int i=-64;i<=64;i++)
for (int j=0;j<=64;j++)
for (int k=0;k<=j;k++)
ans[i+_0][j]=(1LL*C[j][k]*abs(i+2*k-j)+ans[i+_0][j])%mod;
T=read();
while (T--){
for (n=read(),t=0;n;d[++t]=n&1,n>>=1);
int res=0,tot=0;
for (int i=t-1;i>=1;i--){
int k=(d[i]==d[i+1])?1:-1;
del(res+=ans[0+_0][i-1]);
if (d[i]==1)
del(res+=ans[tot-k+_0][i-1]);
tot+=k;
}
del(res+=abs(tot));
printf("%d\n",res);
}
return 0;
}

截止 2018-07-28  23:18 最短代码

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=150,_0=74,mod=1e9+7;
int C[N][N],ans[N][N],T,d[N],t;
LL n;
int main(){
for (int i=0;i<N;i++)
C[i][0]=1;
for (int i=1;i<N;i++)
for (int j=1;j<=i;j++)
C[i][j]=(C[i-1][j-1]+C[i-1][j])%mod;
for (int i=-64;i<=64;i++)
for (int j=0;j<=64;j++)
for (int k=0;k<=j;k++)
ans[i+_0][j]=(1LL*C[j][k]*abs(i+2*k-j)+ans[i+_0][j])%mod;
scanf("%d",&T);
while (T--){
scanf("%lld",&n);
for (t=0;n;d[++t]=n&1,n>>=1);
int res=0,tot=0;
for (int i=t-1;i>=1;i--){
int k=(d[i]==d[i+1])?1:-1;
res=(res+ans[0+_0][i-1])%mod;
if (d[i]==1)
res=(res+ans[tot-k+_0][i-1])%mod;
tot+=k;
}
printf("%d\n",(res+abs(tot))%mod);
}
return 0;
}

  

2018牛客网暑假ACM多校训练赛(第四场)C Chiaki Sequence Reloaded (组合+计数) 或 数位dp的更多相关文章

  1. 2018牛客网暑假ACM多校训练赛(第二场)E tree 动态规划

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round2-E.html 题目传送门 - 2018牛客多校赛第二场 E ...

  2. 2018牛客网暑假ACM多校训练赛(第三场)I Expected Size of Random Convex Hull 计算几何,凸包,其他

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round3-I.html 题目传送门 - 2018牛客多校赛第三场 I ...

  3. 2018牛客网暑假ACM多校训练赛(第三场)G Coloring Tree 计数,bfs

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round3-G.html 题目传送门 - 2018牛客多校赛第三场 G ...

  4. 2018牛客网暑假ACM多校训练赛(第三场)D Encrypted String Matching 多项式 FFT

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round3-D.html 题目传送门 - 2018牛客多校赛第三场 D ...

  5. 2018牛客网暑假ACM多校训练赛(第十场)H Rikka with Ants 类欧几里德算法

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round10-H.html 题目传送门 - https://www.n ...

  6. 2018牛客网暑假ACM多校训练赛(第十场)F Rikka with Line Graph 最短路 Floyd

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round10-F.html 题目传送门 - https://www.n ...

  7. 2018牛客网暑假ACM多校训练赛(第十场)D Rikka with Prefix Sum 组合数学

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round10-D.html 题目传送门 - https://www.n ...

  8. 2018牛客网暑假ACM多校训练赛(第八场)H Playing games 博弈 FWT

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round8-H.html 题目传送门 - https://www.no ...

  9. 2018牛客网暑假ACM多校训练赛(第七场)I Tree Subset Diameter 动态规划 长链剖分 线段树

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round7-I.html 题目传送门 -  https://www.n ...

随机推荐

  1. python ctypes

    official tutorial for ctypes libhttps://docs.python.org/3/library/ctypes.html 1 ctypes exports the c ...

  2. Windows 下搭建 SVN服务器及使用

    目录 一 .安装Visual SVN 二.配置SVN 三.安装TortoiseSVN 四.上传项目到远程仓库 五.从远程仓库下载项目 六.检出项目 七.版本回退 参考链接 http://blog.cs ...

  3. JQery插件zClip ----实现粘贴复制功能

    使用了这个插件,但是用在table,td中话,我是一个列表来的,对此使用此插件还是有点问题的?点击其中的一个会全部都被选中. <script type="text/javascript ...

  4. ajax返回的欧洲字符(例如:法文)乱码

    ajax返回值的乱码现象产生的相关代码如下: Java代码: JsonObject jsonObject = new JsonObject(); jsonObject.addProperty(&quo ...

  5. [POSIX]文件系统(概述)

    1.文件名由除系统目录分隔符(unix是/,windows是\)和空字符“\0”外的任意ASCII字符组成,现代系统很多还可以包含UNICODE字符,但是还是推荐使用传统的ASCII码命名. 2.目录 ...

  6. Django 笔记(五)自定义标签 ~ 映射mysql

    创建简单标签: 1-3 或者 2-3 创建包含标签: 1-2或1-3或1-4(推荐) 包含标签使用: 2 和 4对应上面的使用方法 在虚拟环境中安装: pip install pymysql 在set ...

  7. 洛谷P4689 [Ynoi2016]这是我自己的发明 [莫队]

    传送门 ynoi中比较良心不卡常的题. 思路 没有换根操作时显然可以变成dfs序莫队随便搞. 换根操作时一个子树可以变成两段区间的并集,也随便搞搞就好了. 这题完全不卡常,随便过. 代码 #inclu ...

  8. Confluence 6 home 目录

    Confluence Home 目录是存储 Confluence 信息,查找索引,页面附件的地方.其实 Home 目录也可以定义为数据目录. 找到 Home 目录 Confluence 的 home ...

  9. Confluence 6 重构查找索引

    查找索引是自动维护的,但是你有时候可能会因为你在查找的时候或查看者邮件主题出现了异常,或者你的 Confluence 实例升级到了新的版本,你可能需要手动重构索引. 进行搜索索引重构: 在屏幕的右上角 ...

  10. LeetCode(77):组合

    Medium! 题目描述: 给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合. 示例: 输入: n = 4, k = 2 输出: [ [2,4], [3,4], [2,3] ...