题链:

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. Beta敏捷冲刺每日报告——Day2

    1.情况简述 Beta阶段Scrum Meeting 敏捷开发起止时间 2017.11.2 00:00 -- 2017.11.3 00:00 讨论时间地点 2017.11.2 晚9:30,电话会议会议 ...

  2. Beta阶段总结分析报告

    1 讨论照片 2 Postmortem结果 二手交易平台项目Postmortem结果 整理:程环宇 设想和目标 1.       我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有 ...

  3. HASH方法课下补分博客

    课堂要求:利用除留余数法为下列关键字集合的存储设计hash函数,并画出分别用开放寻址法和拉链法解决冲突得到的空间存储状态(散列因子取0.75)关键字集合:85,75,57,60,65,(你的8位学号相 ...

  4. appcompat v21: 让 Android 5.0 前的设备支持 Material Design

    1. 十大Material Design开源项目 2. appcompat v21: 让 Android 5.0 前的设备支持 Material Design 主题 AppCompat已经支持最新的调 ...

  5. Hibernate之Hibernate的下载与安装

    Hibernate用法十分简单,当我们在Java项目中引入Hibernate框架之后,就能以面向对象的方式来操作关系数据库了. 下载: 登陆Hibernate官网,下载Hibernate压缩包,win ...

  6. Android Notification setLatestEventInfo方法已废弃

    代替setLatestEventInfo的方法是用Notification.Builder创建Builder对象,通过该对象设置Notification相关属性. otification.Builde ...

  7. 【作业】HansBug的前三次OO作业分析与小结

    OO课程目前已经进行了三次的作业,容我在本文中做一点微小的工作. 第一次作业 第一次作业由于难度不大,所以笔者程序实际上写的也比较随意一些.(点击就送指导书~) 类图 程序的大致结构如下: 代码分析 ...

  8. Spring+Hibernate+Struts(SSH)框架整合

    SSH框架整合 前言:有人说,现在还是流行主流框架,SSM都出来很久了,更不要说SSH.我不以为然.现在许多公司所用的老项目还是ssh,如果改成流行框架,需要成本.比如金融IT这一块,数据库dao层还 ...

  9. 在thinkphp框架中使用后台传值过来的数组,在hightcart中使用数组

    js的数组是和php里面数组是不一样的,所以模板文件需要先接受,然后利用Js代码转化之后再使用,接受后台的数组有几种办法 1.后台传过来的json数组,利用Js是可以接受的,然后将json数据利用js ...

  10. ViurtualBox配置虚拟机Linux的网络环境

    之前可以使用VMware配置成功,让虚拟机和本地通信,虚拟机可以访问外网,但是VMware体积太大了,最后终于把virtualBox也配置成功,也使得两者兼备 环境:本地windows7 64位专业版 ...