题链:

http://acm.hdu.edu.cn/showproblem.php?pid=5608

题解:

莫比乌斯反演,杜教筛

已知$$N^2-3N+2=\sum_{d|N} f(d)$$

多次询问,给出n,求f的前缀和S(n)。


把f函数卷上$I(x)=1$

那么有:

$$\sum_{i=1}^{n}f*l(i)=\sum_{i=1}^{n}l(i)S(\lfloor \frac{n}{i} \rfloor)$$

所以:

$$S(n)=\sum_{i=1}^{n}f*l(i)-\sum_{i=2}^{n}S(\lfloor \frac{n}{i} \rfloor)$$

又因为

$$\begin{aligned}
\sum_{i=1}^{n}f*l(i)&=\sum_{i=1}^{n}\sum_{d|i}f(d)l(\frac{i}{d})\\
&=\sum_{i=1}^{n}\sum_{d|i}f(d)\\
&=\sum_{i=1}^{n}(i^2-3i+2)\\
&=\frac{n(n+1)(2n+1)}{6}-\frac{3n(1+n)}{2}+2n\\
\end{aligned}$$

所以

$$S(n)=\frac{n(n+1)(2n+1)}{6}-\frac{3n(1+n)}{2}+2n-\sum_{i=2}^{n}S(\lfloor \frac{n}{i} \rfloor)$$

到此,就可以直接用杜教筛求解了,不过有点慢。


我们可以先预处理出前$n^{\frac{2}{3}}$个的前缀和

令$F(N)=N^2-3N+2$,那么F就是f的约数和函数

(因为$F(N)=\sum_{d|N}f(d)$)

所以由莫比乌斯反演可知:

$$f(N)=\sum_{d|N}\mu(d)F(\frac{N}{d})$$

然后可以用$O(nlogn)$的复杂度先处理出一些前缀和,

然后再杜教筛即可。

代码:

#include<bits/stdc++.h>
#define DJM 1000000
using namespace std;
const int mod=1000000007;
struct Hash_Table{
#define Hmod 1425367
int org[DJM+50],val[DJM+50],nxt[DJM+50],head[Hmod],hnt;
Hash_Table(){hnt=1;}
void Push(int x,int v){
static int u; u=x%Hmod;
org[hnt]=x; val[hnt]=v; nxt[hnt]=head[u]; head[u]=hnt++;
}
int Find(int x){
static int u; u=x%Hmod;
for(int i=head[u];i;i=nxt[i])
if(org[i]==x) return val[i];
return -1;
}
}H;
int mu[DJM+50],F[DJM+50],f[DJM+50];
void Sieve(){
static bool np[DJM+50];
static int prime[DJM+50],pnt;
mu[1]=1;
for(int i=2;i<=DJM;i++){
F[i]=(1ll*i*i-3*i+2+mod)%mod;
if(!np[i]) prime[++pnt]=i,mu[i]=-1;
for(int j=1;j<=pnt&&i<=DJM/prime[j];j++){
np[i*prime[j]]=1;
if(i%prime[j]) mu[i*prime[j]]=-mu[i];
else break;
}
}
for(int d=1;d<=DJM;d++)
for(int i=1;i*d<=DJM;i++)
f[i*d]=(1ll*f[i*d]+1ll*mu[d]*F[i]%mod+mod)%mod;
for(int i=1;i<=DJM;i++) f[i]=(1ll*f[i]+f[i-1])%mod;
}
int DJ_pf(int n){
static int inv6=166666668;
if(n<=DJM) return f[n];
if(H.Find(n)!=-1) return H.Find(n);
int ret=(1ll*n*(n+1)%mod*(2*n+1)%mod*inv6%mod-3ll*(1+n)*n/2%mod+2ll*n%mod+mod)%mod;
for(int i=2,last;i<=n;i=last+1){
last=n/(n/i);
ret=(1ll*ret-1ll*(last-i+1)*DJ_pf(n/i)%mod+mod)%mod;
}
H.Push(n,ret);
return ret;
}
int main(){
Sieve(); int Case,n;
for(scanf("%d",&Case);Case;Case--){
scanf("%d",&n);
printf("%d\n",DJ_pf(n));
}
return 0;
}

  

●HDU 5608 function的更多相关文章

  1. HDU 5608 function [杜教筛]

    HDU 5608 function 题意:数论函数满足\(N^2-3N+2=\sum_{d|N} f(d)\),求前缀和 裸题-连卷上\(1\)都告诉你了 预处理\(S(n)\)的话反演一下用枚举倍数 ...

  2. HDU 5608 - function

    HDU 5608 - function 套路题 图片来自: https://blog.csdn.net/V5ZSQ/article/details/52116285 杜教筛思想,根号递归下去. 先搞出 ...

  3. [HDU 5608]Function(莫比乌斯反演 + 杜教筛)

    题目描述 有N2−3N+2=∑d∣Nf(d)N^2-3N+2=\sum_{d|N} f(d)N2−3N+2=∑d∣N​f(d) 求∑i=1Nf(i)\sum_{i=1}^{N} f(i)∑i=1N​f ...

  4. HDU 5608 function(莫比乌斯反演 + 杜教筛)题解

    题意: 已知\(N^2-3N+2=\sum_{d|N}f(d)\),求\(\sum_{i=1}^nf(i) \mod 1e9+7\),\(n\leq1e9\) 思路: 杜教筛基础题? 很显然这里已经设 ...

  5. HDU 6038 - Function | 2017 Multi-University Training Contest 1

    /* HDU 6038 - Function [ 置换,构图 ] 题意: 给出两组排列 a[], b[] 问 满足 f(i) = b[f(a[i])] 的 f 的数目 分析: 假设 a[] = {2, ...

  6. 洛谷P1464 Function  HDU P1579 Function Run Fun

    洛谷P1464 Function HDU P1579 Function Run Fun 题目描述 对于一个递归函数w(a,b,c) 如果a≤0 or b≤0 or c≤0就返回值11. 如果a> ...

  7. HDU 5875 Function 【倍增】 (2016 ACM/ICPC Asia Regional Dalian Online)

    Function Time Limit: 7000/3500 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total ...

  8. 2017 Multi-University Training Contest - Team 1 1006&&HDU 6038 Function【DFS+数论】

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

  9. HDU 5875 Function 优先队列+离线

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5875 Function Time Limit: 7000/3500 MS (Java/Others) ...

随机推荐

  1. alpha-咸鱼冲刺day2-紫仪

    总汇链接 一,合照 emmmmm.自然是没有的. 二,项目燃尽图 三,项目进展 今天并没有什么进展,弄了好久好像也只研究出怎么把JS的功能块插入进去.html的信息提交这些还不知道要怎么弄. 四,问题 ...

  2. VMware安装时Error 1324. The path My Documents contains a invalid character的原因和解决方法

    终于找到了自己想要的答案,顶顶,吼吼~ 我今天安装VMware Workstation时,总是提示我Error 1324. The path My Documents contains a inval ...

  3. 201621123031 《Java程序设计》第7周学习总结

    作业07-Java GUI编程 1.本周学习总结 1.1 思维导图:Java图形界面总结 1.2 可选:使用常规方法总结其他上课内容. 事件监听器: Java事件监听器是由事件类和监听接口组成,自定义 ...

  4. 201621123043《java程序设计》第4周学习总结

    1. 本周学习总结 1.1 写出你认为本周学习中比较重要的知识点关键词 关键字:继承.覆盖.多态 1.2 尝试使用思维导图将这些关键词组织起来.注:思维导图一般不需要出现过多的字. 1.3 可选:使用 ...

  5. nyoj 韩信点兵

    描述相传韩信才智过人,从不直接清点自己军队的人数,只要让士兵先后以三人一排.五人一排.七人一排地变换队形,而他每次只掠一眼队伍的排尾就知道总人数了.输入3个非负整数a,b,c ,表示每种队形排尾的人数 ...

  6. CentOS 7 安装Graphite

    Graphite简介 Graphite是一个Python编写的企业级开源监控工具,采用django框架,用来收集服务器所有的即时状态,用户请求信息,Memcached命中率,RabbitMQ消息服务器 ...

  7. JAVA_SE基础——24.面向对象的内存分析

    黑马程序员入学blog ... 接着上一章的代码: //车类 class Car{ //事物的公共属性使用成员变量描述. String name; //名字的属性 String color; //颜色 ...

  8. SQL SERVER 字符串按数字排序

    需求是这样的: 数据库表里面有一个字段类型是nvachar,存的值是数字和字符混合的,要实现先按数字排序,再按字母倒序. 思路: 考虑这个字段的值是否是有规律可循的,把要按数字排序的部分转换为数字,再 ...

  9. Delaunay三角化算法

    参考:<平面域中的Delaunay三角算法>

  10. 利用JavaScript去掉数组中重复项

    利用JavaScript的object的特性,我们可以非常容易的实现将一个数组的重复项去掉. object的特性是:key一定是唯一的. 把数组重复项去掉: 1 将数组转换成一个object对象,数组 ...