BZOJ 1363 最小公倍数之和

Description

求\(\sum_{i=1}^n[i,n],n\leqslant 10^9,T\leqslant 5\times 10^4\)

Solution

数论+欧拉函数...

破题有毒...

推导和BZOJ 2226: [Spoj 5971] LCMSum一样...

但是需要枚举所有约数,同时统计一下\(\varphi\)...

Code

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

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

ll ans,n,x;
int b[N],pr[N],cp;
ll d[N],c[N],cd;

void pre(int n) {
	for(int i=2;i<=n;i++) {
		if(!b[i]) pr[++cp]=i;
		for(int j=1;j<=cp && i*pr[j]<=n;j++) {
			b[i*pr[j]]=1;
			if(i%pr[j]==0) break;
		}
	}
}
void DFS(int x,int s,int ph) {
	if(x==cd+1) { if(s!=1) ans=(ans+(ll)s*ph/2)%p;else ans=(ans+1)%p;return; }
	DFS(x+1,s,ph);
	ph*=(d[x]-1),s*=d[x];
	DFS(x+1,s,ph);
	for(int i=2;i<=c[x];i++) ph*=d[x],s*=d[x],DFS(x+1,s,ph);
}
int main() {
	int T;
	pre(1000000);
	for(scanf("%d",&T);T--;) {
		scanf("%lld",&n);
		cd=0,ans=0,x=n;
		for(int i=1;i<=cp && pr[i]*pr[i]<=x;i++) if(x%pr[i]==0) {
			d[++cd]=pr[i],c[cd]=0;
			for(;x%pr[i]==0;c[cd]++,x/=pr[i]);
		}if(x>1) d[++cd]=x,c[cd]=1;
		DFS(1,1,1);
		printf("%lld\n",ans*n%p);
	}
	return 0;
}

  

时间: 2024-10-09 19:38:33

BZOJ 1363 最小公倍数之和的相关文章

1363 最小公倍数之和

1363 最小公倍数之和 题目来源: SPOJ 基准时间限制:1.5 秒 空间限制:131072 KB 给出一个n,求1-n这n个数,同n的最小公倍数的和.例如:n = 6,1,2,3,4,5,6 同6的最小公倍数分别为6,6,6,12,30,6,加在一起 = 66. 由于结果很大,输出Mod 1000000007的结果. Input 第1行:一个数T,表示后面用作输入测试的数的数量.(1 <= T <= 50000) 第2 - T + 1行:T个数A[i](A[i] <= 10^9)

51nod - 1363 - 最小公倍数之和 - 数论

https://www.51nod.com/Challenge/Problem.html#!#problemId=1363 求\(\sum\limits_{i=1}^{n}lcm(i,n)\) 先换成gcd: \(\sum\limits_{i=1}^{n}\frac{i*n}{gcd(i,n)}\) 显而易见,枚举g: $ n * \sum\limits_{g|n} \frac{1}{g} \sum\limits_{i=1}^{n} i*[gcd(i,n)==g] $ 提g,没有下整符号: $

51nod 1363 最小公倍数的和 欧拉函数+二进制枚举

1363 最小公倍数之和 题目来源: SPOJ 基准时间限制:1.5 秒 空间限制:131072 KB 分值: 160 给出一个n,求1-n这n个数,同n的最小公倍数的和.例如:n = 6,1,2,3,4,5,6 同6的最小公倍数分别为6,6,6,12,30,6,加在一起 = 66. 由于结果很大,输出Mod 1000000007的结果. Input 第1行:一个数T,表示后面用作输入测试的数的数量.(1 <= T <= 50000) 第2 - T + 1行:T个数A[i](A[i] <

51Nod 最大公约数之和V1,V2,V3;最小公倍数之和V1,V2,V3

1040 最大公约数之和 给出一个n,求1-n这n个数,同n的最大公约数的和.比如:n = 6 1,2,3,4,5,6 同6的最大公约数分别为1,2,3,2,1,6,加在一起 = 15 输入 1个数N(N <= 10^9) 输出 公约数之和 输入样例 6 输出样例 15 题解 \[ \sum_{i=1}^n\gcd(i,n)=\sum_{d|n}d\varphi(n) \] 暴力搞就行了. 1188 最大公约数之和 V2 给出一个数N,输出小于等于N的所有数,两两之间的最大公约数之和. 相当于计

BNU 12846 LCM Extreme 最小公倍数之和(线性欧拉筛选+递推)

LCM Extreme Time Limit: 3000ms Memory Limit: 131072KB This problem will be judged on UVALive. Original ID: 596464-bit integer IO format: %lld      Java class name: Main Find the result of the following code:unsigned long long allPairLcm(int n){ unsig

51 NOD 1238 最小公倍数之和 V3

原题链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1238 最近被51NOD的数论题各种刷……(NOI快到了我在干什么啊! 然后发现这题在网上找不到题解……那么既然A了就来骗一波访问量吧…… (然而并不会用什么公式编辑器,凑合着看吧…… Σ(1<=i<=n) Σ(1<=j<=n) i*j/gcd(i,j) =Σ(1<=d<=n) d * Σ(1<=i<=[n/d]) Σ(1&

51nod1238 最小公倍数之和 V3 莫比乌斯函数 杜教筛

题意:求\(\sum_{i = 1}^{n}\sum_{j = 1}^{n}lcm(i, j)\). 题解:因为是用的莫比乌斯函数求的,所以推导比大部分题解多...而且我写式子一般都比较详细,所以可能看上去很多式子,实际上是因为每一步都写了,几乎没有跳过的.所以应该都可以看懂的. 末尾的\(e\)函数是指的\(e[1] = 1\),\(e[x] = 0(x != 1)\)这样一个函数 \[\sum_{i = 1}^{n}\sum_{j = 1}^{n}lcm(i, j)\] \[\sum_{i

BZOJ 1257 余数之和sum(分块优化)

题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=46954 题意:f(n, k)=k mod 1 + k mod 2 + k mod 3 + … + k mod n,输入n, k,求f(n, k). 思路:n>k的部分都为k,直接判断即可.n < k时,k mod n = k - k / n * n,观察发现在一定的区间[lhs, rhs]内k/i的值不变.那么就可以直接分块了,  k/lhs * lhs + k

BZOJ 1257 余数之和sum

        这道题题意十分简单,理解绝对没问题,唯一需要考虑的就是数据范围容易超时,经过 观察找到了一个规律可以让数据缩小一半,理论上感觉过不去,没想到A了,在这里现个丑,给大家介绍一下.         假设(20,10),根据题意,我们需要用10 mol (1~20)中每一个数,显然当大于10之后就不用考虑,余数必为10,当处于(10/2~10)中间的范围时余数恰好为9,8,7,6,5,4,3,2,1,0,因此只要求一下k与l/2的差就可以求出大于l/2的余数和了,剩下的暴力一下就行了.