典型的数列反演题。

运用莫比乌斯反演的一个结论 $[n = 1] = \sum_{d | n} \mu(d)$,将表达式做如下转化:

$$ ans = \sum_{i=1}^n \sum_{j=1}^i (\lfloor \frac{i-1}{j} \rfloor + 1) \sum_{d | i \land d | j} \mu(d) \\ = \sum_{d=1}^n \mu(d) \sum_{i=1}^{\lfloor \frac{n}{d} \rfloor} \sum_{j=1}^i (\lfloor \frac{i-1}{j} \rfloor + 1) $$

令$$F_n = \sum_{i=1}^n \sum_{j=1}^i (\lfloor \frac{i-1}{j} \rfloor + 1)$$

则有$$ans = \sum_{d=1}^n \mu(d) F(\lfloor \frac{n}{d} \rfloor)$$

先考虑如何计算Fn.

观察得知,内层求和与n无直接关联,不妨直接对F相邻两项做差:

$$dF_n = F_n - F_{n-1} \\= \sum_{j=1}^n (\lfloor \frac{n-1}{j} \rfloor + 1) $$

考虑每个j对每个n的贡献。

对于一个给定的j,我们可以枚举$\lfloor \frac{n-1}{j} \rfloor$的取值t,此时j和t将对$[j*t+1, j*(t+1)+1)$这一范围内所有的n对应的$F_n$产生t+1的贡献。

由调和级数可知,对所有j枚举它们在N以内的倍数只需要O(Nlog(N))级别的时间复杂度。我们只要在枚举j和t的同时维护一下$dF_n$的相邻两项差,最后做两次前缀和就可以得到$F_n$数列了。

再来考虑如何由$F_n$计算$ans_n$。

由$ans_n = \sum_{d=1}^n \mu(d) F(\lfloor \frac{n}{d} \rfloor)$,与上一步类似,同样可以考虑每个d对每个n的答案的贡献。对于每个d,枚举$\lfloor \frac{n}{d} \rfloor$的取值t,此时d和t对$[t*d, (t+1)*d)$范围内所有的n对应的$ans_n$产生$\mu(d) * F_t$ 的贡献。枚举结束后再做一遍前缀和即可。

 #include <iostream>
#include <cmath>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = , mod = ;
typedef long long LL;
int mu[maxn], muS[maxn], F[maxn], ans[maxn], P[maxn], pcnt, N;
bool not_p[maxn]; void sieve()
{
mu[] = ;
for(int i = ;i < maxn;++i)
{
if(!not_p[i]) P[pcnt++] = i, mu[i] = -;
for(int j = ;j < pcnt;++j)
{
if(i * P[j] >= maxn) break;
not_p[i * P[j]] = true;
if(i % P[j] == )
{
mu[i * P[j]] = ;
break;
}
else mu[i * P[j]] = -mu[i];
}
}
} void init()
{
sieve();
for(int i = ;i <= N;++i) muS[i] = muS[i-] + mu[i];
N = ;
int L, R;
for(int k = ;k < N;++k)
{
L = k, R = k+k;
for(int t = ;L < N;++t, L += k, R += k)
{
F[L+] = (F[L+] + t) % mod;
if(R < N) F[R+] = (F[R+] - t) % mod;
//if(L < 3) printf("k = %d, (%d, %d] = %d\n", k, L, N, t);
}
}
for(int i = ;i <= N;++i) F[i] = (F[i] + F[i-]) % mod;
for(int i = ;i <= N;++i) F[i] = (F[i] + F[i-]) % mod;
for(int i = ;i <= N;++i)
F[i] = (F[i] + (LL) i * (i+) / ) % mod;
for(int i = ;i <= N;++i) //F[d]
{
for(int j = , k = i;k <= N;++j, k += i)
{
int tmp = (mod + F[j] * mu[i]) % mod;
ans[k] = (ans[k] + tmp) % mod;
if(k+i <= N) ans[k+i] = (ans[k+i] + mod - tmp) % mod;
}
}
for(int i = ;i <= N;++i) ans[i] = (ans[i] + ans[i-]) % mod;
} void work()
{
while(~scanf("%d", &N))
{
printf("%d\n", ans[N]);
}
}
int main() {
// your code goes here
int T;
init();
work();
return ;
}

莫比乌斯函数,差分数列

【2017多校训练08 1002】【HDOJ 6134】Battlestation Operational的更多相关文章

  1. 2017多校第8场 HDU 6134 Battlestation Operational 莫比乌斯反演

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6134 题意: 解法: 那么g(n)怎么求,我们尝试打表发现g(n)是有规律的,g(n)=g(n-1)+ ...

  2. 2017ACM暑期多校联合训练 - Team 8 1002 HDU 6134 Battlestation Operational (数论 莫比乌斯反演)

    题目链接 Problem Description The Death Star, known officially as the DS-1 Orbital Battle Station, also k ...

  3. hdu 6134 Battlestation Operational 莫比乌斯反演

    Battlestation Operational Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  4. 2017 多校训练 1002 Balala Power!

    Balala Power! Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)T ...

  5. hdu 6134: Battlestation Operational (2017 多校第八场 1002)【莫比乌斯】

    题目链接 比赛时没抓住重点,对那个受限制的“分数求和”太过关心了..其实如果先利用莫比乌斯函数的一个性质把后面那个[gcd(i,j)=1]去掉,那么问题就可以简化很多.公式如下 这和之前做过的一道题很 ...

  6. 2017 多校训练 1006 Function

    Function Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total ...

  7. 「2017 Multi-University Training Contest 7」2017多校训练7

    1002 Build a tree(递归) 题目链接 HDU6121 Build a tree 有一棵n个点的有根树,标号为0到n-1,i号点的父亲是\(\lfloor\frac{i-1}{k}\rf ...

  8. 「2017 Multi-University Training Contest 2」2017多校训练2

    1001 Is Derek lying 题目链接 HDU6045 Is Derek lying? 给出两个人选择题的回答,问得分分别为x和y是否可能.(\(1\le N \le 80000,0\le ...

  9. 「2017 Multi-University Training Contest 1」2017多校训练1

    1001 Add More Zero(签到题) 题目链接 HDU6033 Add More Zero 找出最大的k,使得\(2^m-1\ge 10^k\). 直接取log,-1可以忽略不计. #inc ...

随机推荐

  1. aarch64_g4

    golang-github-inconshreveable-muxado-devel-0-0.7.gitf693c7e.fc26.noarch.rpm 2017-02-11 16:47 30K fed ...

  2. idea中使用tomcat 方式启动spring boot项目

    Spring boot 的main 入口启动方式相信都会用,直接运行main直接就启动了,但是往往这种方式并不是最佳的启动方式,比如运维的层面更希望调整tomcat的调优参数,而只使用嵌入启动方式很难 ...

  3. 缓存数据库-redis数据类型和操作(string)

    Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合) 一:String(字符串) string是redis ...

  4. bootstrap表单按回车会自动刷新页面的问题

    想给form表单增加回车自动提交的功能 $('#password').keydown(function(event){ if (event.keyCode == 13) $('#login').cli ...

  5. java基础73 dom4j修改xml里面的内容(网页知识)

    1.DOM4J对XML文件进行增删改操作 实现代码 package com.shore.code; import java.io.File; import java.io.FileOutputStre ...

  6. LCT解读(1)

    蒟蒻的LCT解读(1) 前段时间本蒟蒻自学了一下LCT,但是网上的很多资料并不很全,而且作为一个数组选手,我看指针代码真的很麻烦,所以就在这里写一篇数组选手能看懂的代码. LCT的初步了解 LCT全称 ...

  7. 网络协议之NAT穿透

    NAT IPv4地址只有32位,最多只能提供大致42.9亿个唯一IP地址,当设备越来越多时,IP地址变得越来越稀缺,不能为每个设备都分配一个IP地址.于是,作为NAT规范就出现了.NAT(Networ ...

  8. 奇妙的CSS之CSS3新特性总结

    随着CSS3标准的发布,越来越多的浏览器开始支持最新的CSS标准,虽然还有些新特性支持的不够完美,但相信未来的浏览器一定会完全支持CSS3的,毕竟这代表着大趋势!下面l列出来一些CSS3中出现的新特性 ...

  9. group by 和 distinct 去重比较

    distinct方式就是两两对比,需要遍历整个表.group by分组类似先建立索引再查索引,所以两者对比,小表destinct快,不用建索引.大表group by快.一般来说小表就算建索引,也不会慢 ...

  10. AdvStringGrid 列宽度、列移动、行高度、自动调节

    那么有没有办法,让客户自己去调整列的宽度呢? 那么有没有办法 让列宽度.行高度 随着内容而自动变换呢: unit Unit5; interface uses Winapi.Windows, Winap ...