DIVCNT2 - Counting Divisors (square)

Let \sigma_0(n)σ​0​​(n) be the number of positive divisors of nn.

For example, \sigma_0(1) = 1σ​0​​(1)=1, \sigma_0(2) = 2σ​0​​(2)=2 and \sigma_0(6) = 4σ​0​​(6)=4.

LetS_2(n) = \sum _{i=1}^n \sigma_0(i^2).S​2​​(n)=​i=1​∑​n​​σ​0​​(i​2​​).

Given NN, find S_2(N)S​2​​(N).

Input

First line contains TT (1 \le T \le 100001≤T≤10000), the number of test cases.

Each of the next TT lines contains a single integer NN. (1 \le N \le 10^{12}1≤N≤10​12​​)

Output

For each number NN, output a single line containing S_2(N)S​2​​(N).

Example

Input

5
1
2
3
10
100

Output

1
4
7
48
1194

Explanation for Input

- S_2(3) = \sigma_0(1^2) + \sigma_0(2^2) + \sigma_0(3^2) = 1 + 3 + 3 = 7S​2​​(3)=σ​0​​(1​2​​)+σ​0​​(2​2​​)+σ​0​​(3​2​​)=1+3+3=7

Information

There are 6 Input files.

- Input #1: 1 \le N \le 100001≤N≤10000, TL = 1s.

- Input #2: 1 \le T \le 800,\ 1 \le N \le 10^{8}1≤T≤800, 1≤N≤10​8​​, TL = 20s.

- Input #3: 1 \le T \le 200,\ 1 \le N \le 10^{9}1≤T≤200, 1≤N≤10​9​​, TL = 20s.

- Input #4: 1 \le T \le 40,\ 1 \le N \le 10^{10}1≤T≤40, 1≤N≤10​10​​, TL = 20s.

- Input #5: 1 \le T \le 10,\ 1 \le N \le 10^{11}1≤T≤10, 1≤N≤10​11​​, TL = 20s.

- Input #6: T = 1,\ 1 \le N \le 10^{12}T=1, 1≤N≤10​12​​, TL = 20s.

My C++ solution runs in 5.3 sec. (total time)

Source Limit is 6 KB.

很迷的函数题。

如何求 d(i^2)?

d(i^2)= (2*a1+1)(2*a2+1)(2*a3+1)...(2*ak+1)

我们考虑一下选哪些质因子的集合,上式

=Σ2^|S| *π a[i] ,i属于S

=Σ(p|i)  2^w(p)。

其中w(x)为x的质因子数。

然后发现2^w(x)=Σ(i|x)  μ^2(i)

所以ANS= Σμ^2(i) *Σd(j)  ,其中1<=i<=n,1<=j<=(n/i)。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
int zs[10000005],t=0,T,sq[50000005];
int miu[50000005],low[50000005],maxn;
bool v[50000005];
ll d[50000005],n; inline void init(){
miu[1]=1,d[1]=1,low[1]=1;
for(int i=2;i<=maxn;i++){
if(!v[i]) zs[++t]=i,miu[i]=-1,d[i]=2,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]+1;
else d[u]=d[low[u]]*d[i/low[i]];
break;
} low[u]=zs[j];
d[u]=d[i]<<1;
miu[u]=-miu[i];
}
} for(int i=1;i<=maxn;i++) d[i]+=d[i-1];
for(int i=1;i<=maxn;i++) sq[i]=sq[i-1]+miu[i]*miu[i];
} inline ll getsq(ll x){
if(x<=maxn) return sq[x]; ll an=0;
for(int i=1;i*(ll)i<=x;i++){
an+=miu[i]*(x/(i*(ll)i));
}
return an;
} inline ll getd(ll x){
if(x<=maxn) return d[x]; ll an=0;
for(ll i=1,j,now;i<=x;i=j+1){
now=x/i,j=x/now;
an+=(j-i+1)*now;
}
return an;
} inline ll query(ll x){
ll an=0;
for(ll i=1,j,now;i<=x;i=j+1){
now=x/i,j=x/now;
an+=(getsq(j)-getsq(i-1))*getd(now);
}
return an;
} int main(){
scanf("%d",&T);
if(T>800) maxn=1000000;
else maxn=50000000;
init();
while(T--){
scanf("%lld",&n);
printf("%lld\n",query(n));
}
return 0;
}

  

SPOJ 20713 DIVCNT2 - Counting Divisors (square)的更多相关文章

  1. [SPOJ] DIVCNT2 - Counting Divisors (square) (平方的约数个数前缀和 容斥 卡常)

    题目 vjudge URL:Counting Divisors (square) Let σ0(n)\sigma_0(n)σ0​(n) be the number of positive diviso ...

  2. SPOJ : DIVCNT2 - Counting Divisors (square)

    设 \[f(n)=\sum_{d|n}\mu^2(d)\] 则 \[\begin{eqnarray*}\sigma_0(n^2)&=&\sum_{d|n}f(d)\\ans&= ...

  3. SP20173 DIVCNT2 - Counting Divisors (square)

    Refer 主要思路参考了 Command_block 的题解. Description 给定 \(n\)(\(n\le 10^{10}\)),求 \[\sum_{i=1}^n\sigma_0(i^2 ...

  4. DIVCNT2&&3 - Counting Divisors

    DIVCNT2 - Counting Divisors (square) DIVCNT3 - Counting Divisors (cube) 杜教筛 [学习笔记]杜教筛 (其实不算是杜教筛,类似杜教 ...

  5. SPOJDIVCNT2: Counting Divisors(莫比乌斯反演)

    http://acm.tzc.edu.cn/acmhome/vProblemList.do?method=problemdetail&oj=SPOJ&pid=DIVCNT2 给出n求 ...

  6. HDU 6069 Counting Divisors

    Counting Divisors Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Oth ...

  7. hdu 6069 Counting Divisors(求因子的个数)

    Counting Divisors Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Oth ...

  8. hdu 6069 Counting Divisors 筛法

    Counting Divisors Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Oth ...

  9. 2017 Multi-University Training Contest - Team 4 hdu6069 Counting Divisors

    地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=6069 题目: Counting Divisors Time Limit: 10000/5000 ...

随机推荐

  1. RCP 项目启动图片设置

    第一步 选择启动图片命名为 splash.bmp 第二步 添加 扩展点 然 后在右边的扩展元素细节中填入相应的信息,比如我们在这里的application属 性 为 org.vwpolo.rcp.ex ...

  2. day20 Django Models 操作,多表,多对多

    1 Django models 获取数据的三种方式: 实践: viwes def business(request): v1 = models.Business.objects.all() v2 = ...

  3. Django 六——自定义标签、图片验证码、发送邮件、评论树、组合搜索

    1.自定义标签 2.图片验证码 3.生成邮箱验证码.发送邮件 4.评论树实现 5.组合搜索(Q) 1.自定义标签 配置: a.在app中新建文件夹  templatetags,里面新建  xx.py文 ...

  4. loj2071 「JSOI2016」最佳团体

    分数规划+树形依赖背包orz #include <iostream> #include <cstring> #include <cstdio> #include & ...

  5. 设计模式之第8章-策略模式(Java实现)

    设计模式之第8章-策略模式(Java实现) “年前大酬宾了啊,现在理发冲500送300,冲1000送500了.鱼哥赶紧充钱啊,理发这事基本一个月一回,挺实惠的啊.不过话说那个理发店的老板好傻啊,冲10 ...

  6. IOS开发学习笔记013-内存管理

    内存管理 1.基本知识 2.关闭ARC机制 3.@property 4.循环引用 5.自动释放池 6.内存管理总结 一.基本知识 内存的分类 栈:局部变量 堆:动态申请的对象,变量等 全局(静态):s ...

  7. jquery实现轮播插件

    这几天用jquery写了两个轮播的插件,功能很简单.第一次尝试写插件,有很多不足的地方,代码如下: 注:图片链接请替换掉,配置信息必须加上图片width和height. <!DOCTYPE ht ...

  8. day05_10 作业

    bug1.0版本 #购物车程序 salary = int(input("请输入你的工资")) item = ['iphone6s','macbook','coffee','pyth ...

  9. sqlserver执行时间和自行效率

    SET STATISTICS PROFILE ON --SET STATISTICS IO ON --SET STATISTICS TIME ON declare @dtm datetime SQL语 ...

  10. File IO(NIO.2):路径类 和 路径操作

    路径类 Java SE 7版本中引入的Path类是java.nio.file包的主要入口点之一.如果您的应用程序使用文件I / O,您将需要了解此类的强大功能. 版本注意:如果您有使用java.io. ...