51nod1238 最小公倍数之和V3
来源:互联网 发布:Java中log4j的用法 编辑:程序博客网 时间:2024/06/04 23:28
题目:求
先算一个东西。
证:
反演一波
把分数外边的g和分子上的g消掉,把n提出去。
括号里的两项拆开
左边是经典的式子
右边只有n=1时有值
就是说小于等于n的数中于n互质的和是A(n)。
令
带入C(i/d)
把常数提出来,顺便交换d和i/d
把A(i)带入
2的常数就没了,然后看
设
枚举
这样左边就可以配一个
#include <stdio.h>#include <algorithm>using namespace std;//long longconst long long maxn = 5100000;const long long mod = 1000000007;const long long mod1 = 1000007;const long long rev2 = 500000004;const long long rev6 = 166666668;struct link { long long x , y; link *next;} pool[maxn] , *g[mod1 + 13];long long top;long long n , N;long long p[maxn] , prime[maxn] , tot;long long f[maxn];long long ans;void predo () { long long i , j; N = 4700000; f[1] = 1; for ( i = 2 ; i <= N ; i++ ) { if ( p[i] == 0 ) { prime[++tot] = i; f[i] = i - 1; } for ( j = 1 ; j <= tot ; j++ ) { if ( i * prime[j] > N ) break; p[i*prime[j]] = 1; f[i*prime[j]] = f[i] * (prime[j] - 1); if ( i % prime[j] == 0 ) { f[i*prime[j]] = f[i] * prime[j]; break; } } } for ( i = 1 ; i <= N ; i++ ) { f[i] = (((f[i]*i)%mod)*i)%mod; } for ( i = 1 ; i <= N ; i++ ) f[i] = (f[i] + f[i-1]) % mod;}long long linsum ( long long x ) { long long ret; ret = ((x%mod)*((x+1)%mod))%mod; ret = (ret*rev2) % mod; return ret;}long long sqrsum ( long long x ) { long long ret; ret = ( (x%mod) * ((x+1)%mod) ) % mod; ret = (ret * ((2*x+1)%mod) ) % mod; ret = (ret * rev6) % mod; return ret;}long long get ( long long x ) { if ( x <= N ) return f[x]; for ( link *j = g[x%mod1] ; j ; j = j -> next ) if ( j -> x == x ) return j -> y; long long l , r , ret = ((((x%mod)*((x+1)%mod))%mod)*rev2)%mod; ret = (ret*ret) % mod; for ( l = 2 ; l <= x ; l = r + 1 ) { r = x/(x/l); ret -= ( ((sqrsum(r)-sqrsum(l-1)+mod)%mod) * get ( x / l ) ) % mod; ret += mod; ret %= mod; } link *tmp = &pool[++top]; tmp -> x = x; tmp -> y = ret; tmp -> next = g[x%mod1]; g[x%mod1] = tmp; return ret;}void work () { long long l , r; scanf ( "%lld" , &n ); for ( l = 1 ; l <= n ; l = r + 1 ) { r = n/(n/l); ans += ( ((get(r)-get(l-1)+mod)%mod) * linsum (n/l) ) % mod; ans %= mod; } printf ( "%lld\n" , ans );}int main () { predo (); work (); return 0;}
阅读全文
0 0
- 【51nod1238】 最小公倍数之和 V3
- 51nod1238 最小公倍数之和V3
- 51nod1238 最小公倍数之和 V3
- [杜教筛] 51nod1238. 最小公倍数之和 V3
- [51nod1238]最小公倍数之和
- [杜教筛+莫比乌斯反演] 51Nod1238: 最小公倍数之和 V3
- [杜教筛] 51Nod 1238 最小公倍数之和 V3
- 【51NOD 1238】最小公倍数之和 V3
- 51nod 1238 最小公倍数之和 V3
- 51nod 1238 最小公倍数之和 V3
- 51Nod-1238-最小公倍数之和 V3
- 51nod 1238 最小公倍数之和 V3
- 51NOD1238
- 【51nod1363】最小公倍数之和
- [数论][莫比乌斯反演][杜教筛] 51Nod 1238 最小公倍数之和 V3
- 51 nod 1363 最小公倍数之和
- 【51Nod 1363】最小公倍数之和
- [51nod1190]最小公倍数之和V2
- vue cli+axios踩坑记录+拦截器使用,代理跨域proxy(更新)
- 扩展欧几里得
- vue开发:vue全局组件的方法
- BZOJ 3687: 简单题
- EM算法及其应用
- 51nod1238 最小公倍数之和V3
- 背景建模之codebook算法
- 【微营销】第8天 微营销实战技巧之如何定位精准客户
- leetcode 70. Climbing Stairs
- 建立中序线索树
- USACO-Section1.3 Barn Repair
- C++类的内存分配
- Spring的aspectj的AOP操作(前置增强 后置增强 环绕)
- 基于UDP的socket编程