1220 约数之和 
                                题目来源: Project Euler
基准时间限制:3 秒 空间限制:131072 KB 分值: 640 难度:8级算法题
 
Discription
d(k)表示k的所有约数的和。d(6) = 1 + 2 + 3 + 6 = 12。
定义S(N) = ∑1<=i<=N ∑1<=j<=N d(i*j)。
例如:S(3) = d(1) + d(2) + d(3) + d(2) + d(4) + d(6) + d(3) + d(6) + d(9) = 59,S(1000) = 563576517282。
给出正整数N,求S(N),由于结果可能会很大,输出Mod 1000000007(10^9 + 7)的结果。
 
Input
输入一个数N(2 <= N <= 10^9)。
Output
输出S(N) Mod 1000000007(10^9 + 7)的结果。
Input示例
1000
Output示例
576513341

我们知道的是,当d(x)表示x的约数的时候,d(i*j)=Σ(p|i)Σ(q|j) [gcd(p,q)==1]
但是当d(x)表示x的约数之和的时候,d(i*j)=Σ(p|i)Σ(q|j) p*q [gcd(p,j/q)==1]
这两者都可以通过质因子分解来证明。
然后式子就好推了,我这里就不推了23333
#include<bits/stdc++.h>
#define ll long long
#define ha 1000000000
using namespace std;
const int maxn=10000000;
ll zs[maxn/5],miu[maxn+5];
ll t=0,low[maxn+5];
bool v[maxn+5];
ll d[maxn+5];
map<ll,ll> mmpd;
map<ll,ll> mmpmiu;
ll n; inline ll add(ll x,ll y){
x+=y;
return x>=ha?x-ha:x;
} inline ll c(ll x){
if(x>ha) x%=ha;
return (x*(x+1)>>1)%ha;
} inline void init(){
d[1]=1,low[1]=1,miu[1]=1;
for(int i=2;i<=maxn;i++){
if(!v[i]) zs[++t]=i,miu[i]=-1,d[i]=i+1,low[i]=i;
for(int j=1,u;j<=t&&(u=zs[j]*i)<=maxn;j++){
v[u]=1;
if(!(i%zs[j])){
low[u]=low[i]*zs[j];
if(low[i]==i) d[u]=d[i]*zs[j]+1ll;
else d[u]=d[low[u]]*d[i/low[i]];
break;
}
low[u]=zs[j];
miu[u]=-miu[i];
d[u]=d[i]*(zs[j]+1);
}
} for(int i=1;i<=maxn;i++){
d[i]=add(d[i-1],d[i]);
miu[i]=add(add(miu[i]*i,ha),miu[i-1]);
}
} inline ll getmiu(ll x){
if(x<=maxn) return miu[x];
if(mmpmiu.count(x)) return mmpmiu[x]; ll an=ha-1;
for(ll i=2,j,now;i<=x;i=j+1){
now=x/i,j=x/now;
an=add(an,add(c(j),ha-c(i-1))*(ll)getmiu(now)%ha);
}
an=ha-an;
mmpmiu[x]=an;
return an;
} inline ll getd(ll x){
if(x<=maxn) return d[x];
if(mmpd.count(x)) return mmpd[x]; ll an=0;
for(ll i=1,j,now;i<=x;i=j+1){
now=x/i,j=x/now;
an=add(an,add(c(j),ha-c(i-1))*(now%ha)%ha);
} mmpd[x]=an;
return an;
} inline void solve(){
ll pre=0,an=0,oops,val;
for(ll i=1,j,now;i<=n;i=j+1){
now=n/i,j=n/now,oops=getmiu(j);
val=getd(now),val=val*(ll)val%ha;
an=add(an,add(oops,ha-pre)*(ll)val%ha);
pre=oops;
} printf("%lld\n",an);
} int main(){
init();
scanf("%lld",&n);
solve(); return 0;
}

  

 

  

 

51Nod 约数之和的更多相关文章

  1. 51NOD 1220 约数之和 [杜教筛]

    1220 约数之和 题意:求\(\sum_{i=1}^n \sum_{j=1}^n \sigma_1(ij)​\) \[ \sigma_0(ij) = \sum_{x\mid i}\sum_{y\mi ...

  2. [51Nod 1220] - 约数之和 (杜教筛)

    题面 令d(n)d(n)d(n)表示nnn的约数之和求 ∑i=1n∑j=1nd(ij)\large\sum_{i=1}^n\sum_{j=1}^nd(ij)i=1∑n​j=1∑n​d(ij) 题目分析 ...

  3. 【动态规划】mr359-最大公约数之和

    [题目大意] 选取和不超过S的若干个不同的正整数,使得所有数的约数(不含它本身)之和最大. 输入一个正整数S. 输出最大的约数之和. 样例输入 Sample Input 11 样例输出 Sample ...

  4. 约数之和(POJ1845 Sumdiv)

    最近应老延的要求再刷<算法进阶指南>(不得不说这本书不错)...这道题花费了较长时间~(当然也因为我太弱了)所以就写个比较易懂的题解啦~ 原题链接:POJ1845 翻译版题目(其实是AcW ...

  5. POJ1845Sumdiv题解--约数之和

    题目链接 https://cn.vjudge.net/problem/POJ-1845 分析 \(POJ\)里的数学题总是这么妙啊 首先有一个结论就是\(A=\prod{ \ {p_i}^{c_i} ...

  6. 51nod 1220 约数之和【莫比乌斯反演+杜教筛】

    首先由这样一个式子:\( d(ij)=\sum_{p|i}\sum_{q|j}[gcd(p,q)==1]\frac{pj}{q} \)大概感性证明一下吧我不会证 然后开始推: \[ \sum_{i=1 ...

  7. 【51nod1220】约数之和

    题目 d(k)表示k的所有约数的和.d(6) = 1 + 2 + 3 + 6 = 12. 定义S(N) = ∑1<=i<=N ∑1<=j<=N d(i*j). 例如:S(3) ...

  8. 51nod 约数和(数论)

    题目链接: 约数和 基准时间限制:2 秒 空间限制:131072 KB 分值: 80 有三个下标从1到n的数组a.b.c. a数组初始全为0. b[i]=∑j|ia[j] c[i]=∑j|ib[j] ...

  9. 51nod1220 约数之和

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1220 $G(n)=\sum\limits_{i=1}^n\sum\lim ...

随机推荐

  1. GoF23种设计模式之行为型模式之状态模式

    一.概述         定义对象之间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新. 二.适用性 1.一个对象的行为取决于它的状态,并且它必须在运行时刻 ...

  2. python3.7 文件操作

    #!/usr/bin/env python __author__ = "lrtao2010" #python3.7 文件操作 # r 只读,默认打开方式,当文件不存在时会报错 # ...

  3. 我的Python分析成长之路7

    类 一.编程范式: 1.函数式编程   def 2.面向过程编程   (Procedural Programming) 基本设计思路就是程序一开始是要着手解决一个大的问题,然后把一个大问题分解成很多个 ...

  4. 浅谈内核的Makefile、Kconfig和.config文件

    Linux内核源码文件繁多,搞不清Makefile.Kconfig..config间的关系,不了解内核编译体系,编译修改内核有问题无从下手,自己写的驱动不知道怎么编进内核,不知道怎么配置内核,这些问题 ...

  5. ssh登陆之忽略known_hosts文件

    在平时工作中,有时候需要SSH登陆到别的Linux主机上去,但有时候SSH登陆会被禁止,并弹出如下类似提示: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ...

  6. LA 5007 Detector Placement 模拟

    题意: 给出一束光线(射线),和一块三角形的棱镜 以及 棱镜的折射率,问光线能否射到X轴上,射到X轴上的坐标是多少. 分析: 其实直接模拟就好了,注意到题目中说不会发生全反射,所以如果射到棱镜中的话就 ...

  7. UVa 10110 Light, more light

    开始所有的灯是灭的,不过我们只关心最后一个灯. 在第i次走动时,只有编号为i的倍数的灯的状态才会改变. 也就是说n有偶数个约数的时候,最后一个灯的状态不会改变,也就是灭的. n有奇数个约数的时候也就是 ...

  8. 写iOS SDK注意事项

    转载http://www.devtang.com/blog/2015/01/31/write-sdk-tips/

  9. Mysql 安装及MySQL-python 问题

    今天遇到了个低级问题: EnvironmentError:mysql_config not found 网上谷歌了一圈发现没用,静下来想的时候才发现新电脑没安装Mysql,吐血 后面再去官网上下载My ...

  10. datatable 修改点击列头进行排序顺序

    一般点击排序时,是先升序后降序 可以通过如下代码修改排序规则 jQuery(function ($) { $(".datatable").dataTable({ "pag ...