[Spoj]Counting Divisors (cube)
来自FallDream的博客,未经允许,请勿转载,谢谢。
设d(x)表示x的约数个数,求$\sum_{i=1}^{n}d(i^{3})$
There are 5 Input files.
- Input #1: 1≤N≤10000, TL = 1s.
- Input #2: 1≤T≤300, 1≤N≤10^8, TL = 20s.
- Input #3: 1≤T≤75, 1≤N≤10^9, TL = 20s.
- Input #4: 1≤T≤15, 1≤N≤10^10, TL = 20s.
- Input #5: 1≤T≤2, 1≤N≤10^11, TL = 20s.
$i^{3}$的约数个数$d(i^{3})$是一个积性函数,所以转而求$d(x)=\prod{F(pi^{ci})}$,其中$F ( pk ^ {ck} )=3ck+1$
可以直接洲阁筛 学了一天大概懂了 顺便抄了个模板
-----
gi表示1-i中与前j个质数互质的数字的F之和
fi表示1-i中由小于根号n的后j个质数组成的数字的F之和
容易得出转移方程 $$g[i][j]=g[i][j]-F(pk)g[\frac{i}{pk}][j-1]$$
$$ f[i][j]=f[i][j-1]+\sum_{ck>=1}F(pk^{ck})f[\frac{i}{pk^{ck}}][j]$$
显然i只有根号种取值 对于每个根号n以内的质数都要转移,复杂度$O(\frac{n}{\log n})$
考虑优化,显然$p_{j+1}>i$的时候,g[i][j]=4(3*1+1)
所以当$pj^{2}>i$的时候,g[i][j]=g[i][j-1]+F(pi) 可以不用转移,用的时候补上那一段即可。
之所以把f的状态表示成"后j个",也是出于这个目的
这样的复杂度近似是$O(\frac{n^{\frac{3}{4}}}{logn})$
然后线筛出根号n以内的F[],答案是$f[n]+\sum_{i=1}^{\sqrt{n}}F[i]g[\frac{n}{i}]$
#include<iostream>
#include<cstdio>
#include<cmath>
#define MN 320000
#define ll long long
using namespace std;
inline ll read()
{
ll x = ; char ch = getchar();
while(ch < '' || ch > '') ch = getchar();
while(ch >= '' && ch <= ''){x = x * + ch - '';ch = getchar();}
return x;
} int s[MN+],num=,last[MN+],l[MN+],l0[MN+],sq,P,N[MN+];
ll f0[MN+],f[MN+],g0[MN+],g[MN+],d[MN+],n;
bool b[MN+]; void CalcF()
{
for(int i=;i<=sq;++i) f[i]=f0[i]=;
for(int i=P-;i;--i)
{
for(int j=;j<=sq&&l[j]>i;++j)
{
ll now=(n/j)/s[i];
for(int tms=;now;now/=s[i],tms+=)
{
if(now<=sq) f[j]+=tms*(f0[now]+*(max(,N[now]-max(i+,l0[now])+)));
else f[j]+=tms*(f[n/now]+*max(,P-max(i+,l[n/now])));
}
}
for(int j=sq;j&&l0[j]>i;--j)
{
ll now=j/s[i];
for(int tms=;now;tms+=,now/=s[i])
f0[j]+=tms*(f0[now]+*max(,N[now]-max(i+,l0[now])+));
}
}
for(int i=;i<=sq;++i) f[i]+=*(P-l[i]);
} void CalcG()
{
for(int i=;i<=sq;++i)
g0[i]=i,g[i]=n/i;
for(int i=;i<P;++i)
{
for(int j=;j<=sq&&l[j]>i;++j)
{
ll now=n/j/s[i];
if(now<=sq) g[j]-=g0[now]-max(,i-l0[now]);
else g[j]-=g[n/now]-max(,i-l[n/now]);
}
for(int j=sq;j&&l0[j]>i;--j)
g0[j]-=g0[j/s[i]]-max(,i-l0[j/s[i]]);
}
for(int i=;i<=sq;++i) g[i]-=P-l[i];
} int main()
{
d[]=;
for(int i=;i<=MN;++i)
{
if(!b[i]) s[++num]=last[i]=i;
for(int j=;s[j]*i<=MN;++j)
{
b[s[j]*i]=,last[s[j]*i]=s[j];
if(i%s[j]==) break;
}
int sum=,tms,p;
for(int j=i;j>;)
{
tms=;p=last[j];
for(;j%p==;j/=p,++tms);
sum*=(tms*+);
}
d[i]=sum;
N[i]=N[i-]+(!b[i]);
}
for(int T=read();T;--T)
{
n=read();sq=sqrt(n);l[sq+]=;
for(P=;1LL*s[P]*s[P]<=n;++P);
for(int i=;i<=sq;++i)
for(l0[i]=l0[i-];1LL*s[l0[i]]*s[l0[i]]<=i;++l0[i]);
for(int i=sq;i;--i)
for(l[i]=l[i+];1LL*s[l[i]]*s[l[i]]<=n/i;++l[i]);
CalcF();CalcG();
ll ans=f[];
for(int i=;i<=sq;++i)
ans+=*d[i]*(g[i]-);
printf("%lld\n",ans);
}
return ;
}
[Spoj]Counting Divisors (cube)的更多相关文章
- [SPOJ20174]DIVCNT3 - Counting Divisors (cube):Min_25筛
分析 首先,STO ywy OTZ,ywy TQL%%%! 说一下这道题用min_25筛怎么做. 容易发现,对于所有质数\(p\),都满足\(f(p)=4\),于是我们就可以直接通过\([1,x]\) ...
- DIVCNT2&&3 - Counting Divisors
DIVCNT2 - Counting Divisors (square) DIVCNT3 - Counting Divisors (cube) 杜教筛 [学习笔记]杜教筛 (其实不算是杜教筛,类似杜教 ...
- SPOJ 20713 DIVCNT2 - Counting Divisors (square)
DIVCNT2 - Counting Divisors (square) #sub-linear #dirichlet-generating-function Let \sigma_0(n)σ0 ...
- [SPOJ] DIVCNT2 - Counting Divisors (square) (平方的约数个数前缀和 容斥 卡常)
题目 vjudge URL:Counting Divisors (square) Let σ0(n)\sigma_0(n)σ0(n) be the number of positive diviso ...
- HDU 6069 Counting Divisors
Counting Divisors Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Oth ...
- hdu 6069 Counting Divisors(求因子的个数)
Counting Divisors Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Oth ...
- hdu 6069 Counting Divisors 筛法
Counting Divisors Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Oth ...
- 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 ...
- hdu6069 Counting Divisors 晒区间素数
/** 题目:hdu6069 Counting Divisors 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6069 题意:求[l,r]内所有数的k次方 ...
随机推荐
- io多路复用(三)
#!/usr/bin/env python # -*- coding:utf-8 -*- import socket sk1 = socket.socket() sk1.bind(('127.0.0. ...
- MyBatis 中使用数据库查询别名进行映射
方法1 XXMapper.xml <mapper namespace="com.hfepc.dao.andon.AndonExceptionKanbanVOMapper" & ...
- EasyUI 中easyui-textbox和easyui-searchbox文本框的点击事件。
html: <input id="txtsearch" class="easyui-textbox" data-options="buttonT ...
- ajax的原理解析
一.关于同步与异步的分析: 异步传输是面向字符的传输,它的单位是字符:而同步传输是面向比特的传输,它的单位是桢,它传输的时候要求接受方和发送方的时钟是保持一致的.而ajax就是采用的异步请求方式的. ...
- JQ.ajax 各种参数及属性设置 ( 转载 )
$.ajax({ type: "post", url: url, dataType:'html', success: function(da ...
- JQ 标签相关知识
1.判断 checkbox 和 radio 是否选中 if($("标签选择器").is(":checked")) 2.改变 checkbox 选中状态 .pro ...
- jenkins简单安装及配置(Windows环境)
jenkins是一款跨平台的持续集成和持续交付.基于Java开发的开源软件,提供任务构建,持续集成监控的功能,可以使开发测试人员更方便的构建软件项目,提高工作效率. Windows平台下,一般安装方法 ...
- 返回到前台的String出现乱码问题
使用springmvc给前天返回String类型的数据出现乱码问题可以在配置环境Spring-mvc.xml中添加如下代码 <mvc:annotation-driven> <mvc: ...
- Mego开发文档 - 从EF6/EFCore迁移到Mego
从EF6/EFCore迁移到Mego框架 如果您有EntityFragmework6或EntityFragmeworkCore的开发经验,在首次接触Mego框架时会发现这两个框架非常相似,本文将帮忙您 ...
- 表单中各种input汇总
html表单 表单用于搜集不同类型的用户输入,表单由不同类型的标签组成,相关标签及属性用法如下: 1.<form>标签 定义整体的表单区域 action属性 定义表单数据提交地址 meth ...