HDU 5608 function

Description

已知\(N^2-3N+2=\sum_{d|N} f(d)\),求\(\sum_{i=1}^nf(i),n\leqslant 10^9\)

Solution

杜教筛+莫比乌斯反演...

入门题...

令\(g(n)=n^2-3n+2\)..

那么\(\sum_{i=1}^ng(n)=\sum_{i=1}^n\sum_{d\mid n} f(d)=\sum_{i=1}^niS(\lfloor\frac{n}{i}\rfloor)\)

所以\(S(n)=\sum_{i=1}^ng(n)-\sum_{i=2}^niS(\lfloor\frac{n}{i}\rfloor)\)

第一个式子可以用平方数和什么的求一下...

然后预处理\(10^6\)...

因为\(g(n)=\sum_{d\mid n}f(d)\),反演一下...

\(f(n)=\sum_{d\mid n}\mu(d)g(\frac{n}{d})\)...

欧拉筛...这样就可以\(n\log n\)预处理了...

Code

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
const int N = 1000050;
const ll p = 1e9+7;

ll Pow(ll a,ll b,ll r=1) { for(;b;b>>=1,a=a*a%p) if(b&1) r=r*a%p;return r; }

ll inv2=Pow(2,p-2),inv6=Pow(6,p-2);
ll S2(ll n) { return n*(n+1)%p*(2*n+1)%p*inv6%p; }
ll S1(ll n) { return n*(n+1)%p*inv2%p; }
ll S1(ll l,ll r) { return S1(r)-S1(l-1); }
ll g(ll n) { return (n*n%p-3*n+2+p)%p; }

int cp,pr[N],b[N],mu[N];
ll f[N];

void pre(int n) {
	mu[1]=1;
	for(int i=2;i<=n;i++) {
		if(!b[i]) pr[++cp]=i,mu[i]=-1;
		for(int j=1;j<=cp && i*pr[j]<=n;j++) {
			b[i*pr[j]]=1;
			if(i%pr[j]) mu[i*pr[j]]=-mu[i];
			else break;
		}
	}
	for(int i=1;i<=n;i++) for(int j=i;j<=n;j+=i) f[j]=(f[j]+g(i)*mu[j/i]%p+p)%p;
	for(int i=1;i<=n;i++) f[i]=(f[i-1]+f[i])%p;
}
map<int,int> mp;

ll S(ll n) {
	if(n<=1000000) return f[n];
	if(mp.count(n)) return mp[n];
	ll fn=((S2(n)-3*S1(n)+2*n)%p+p)%p;
	for(int i=2,j;i<=n;i=j+1) {
		j=n/(n/i);
		fn=(fn-(j-i+1)*S(n/i)%p+p)%p;
	}return mp[n]=fn;
}
int main() {
	int T,n;
	for(pre(1000000),scanf("%d",&T);T--;) {
		scanf("%d",&n);
		printf("%lld\n",S(n));
	}
	return 0;
}

  

时间: 2024-08-24 20:16:37

HDU 5608 function的相关文章

●HDU 5608 function

题链: 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_{

HDU 1331 Function Run Fun

Function Run Fun Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 2173    Accepted Submission(s): 1104 Problem Description We all love recursion! Don't we? Consider a three-parameter recursive fu

HDU 1331 Function Run Fun (基础记忆化搜索)

Function Run Fun Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 2602    Accepted Submission(s): 1263 Problem Description We all love recursion! Don't we? Consider a three-parameter recursive f

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

Function Time Limit: 7000/3500 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Submission(s): 976    Accepted Submission(s): 375 Problem Description The shorter, the simpler. With this problem, you should be convinced of this tru

HDU 6038 Function(思维+寻找循环节)

http://acm.hdu.edu.cn/showproblem.php?pid=6038 题意:给出两个序列,一个是0~n-1的排列a,另一个是0~m-1的排列b,现在求满足的f的个数. 思路: 先看一下样例吧: 对于这组数来说,假如我们先指定了f(0)对应的在b中的值,那么根据第2个式子,就可以得出f(1),根据f(1)就又可以得出f(2),最后根据f(2)就可以检验f(0)的值是否正确. 这也就是说,对于a中的一个循环节,只要确定了其中一个数所映射的值,那么其它数就都被相应的确定了. 所

Hdu 4498 Function Curve(Simpson积分)

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4498 思路:分段积分.求出每个函数与y=100和每两个函数图像的交点,排序后枚举每段取最小值,分段积分. #include<cstdio> #include<vector> #include<cstring> #include<iostream> #include<algorithm> #define debu using namespace std

HDU 1331 Function Run Fun(记忆化搜索)

Problem Description We all love recursion! Don't we? Consider a three-parameter recursive function w(a, b, c): if a <= 0 or b <= 0 or c <= 0, then w(a, b, c) returns:1 if a > 20 or b > 20 or c > 20, then w(a, b, c) returns:w(20, 20, 20)

HDU 5875 Function (2016年大连网络赛 H 线段树+gcd)

很简单的一个题的,结果后台数据有误,自己又太傻卡了3个小时... 题意:给你一串数a再给你一些区间(lef,rig),求出a[lef]%a[lef+1]...%a[rig] 题解:我们可以发现数字a对数字b取模时:如果a<b,则等于原数,否则a会变小至少一半.就是说a最多成功取模(log2 a)次,所以我们只需要每次在区间内找到最前面一个小于等于a的值,接着更新a与区间左端点,直到没有值比a小或者区间取模完成. 我们可以使用线段树求出区间内小于某个值的最前一个位置,具体方法就是:父节点记录区间最

HDU 5875 Function -2016 ICPC 大连赛区网络赛

题目链接 网络赛的水实在太深,这场居然没出线zzz,差了一点点,看到这道题的的时候就剩半个小时了.上面是官方的题意题解,打完了才知道暴力就可以过,暴力我们当时是想出来了的,如果稍稍再优化一下估计就过了zzz.去年有一场现场赛也是n=1000,n^3过了,看来关键时刻实在做不出来就得大胆暴力啊. #include <bits/stdc++.h> using namespace std; typedef long long ll; const int maxn=1e5+5; int a[maxn]