[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次方 ...
随机推荐
- HTML标签小记文本类标签
文本类标签: <input type="text" name="" value="">文本框 type(方式,方法)name文 ...
- IntelliJ IDEA插件——冷门神器分享
IntelliJ IDEA就不必介绍了,至今还能保持IDE前三的神器,如今java程序员的首选,今天介绍几款冷门但绝对是神器的IDEA插件. 前言 IDEA自不必说,IDEA插件是开发中必备的神器,相 ...
- 第一篇:Python入门
一.编程与编程语言 编程的目的: 计算机的发明,是为了用机器取代/解放人力,而编程的目的则是将人类的思想流程按照某种能够被计算机识别表达方式传递给计算机,从而达到让计算机能够像人脑/电脑一样自动执行的 ...
- MSSQL 2000 错误823恢复
一.故障描述 MSSQL Server 2000 附加数据库错误823,附加数据库失败.数据库没有备份,不能通过备份恢复数据库,急需恢复数据库中的数据. 二.故障分析SQL Server数据库 823 ...
- [知识梳理]课本3&9.1
函数:关键词:参数.返回值.函数返回类型.函数体. 函数按照返回类型,可以分为有参函数和无参函数. 函数根据是否有返回值,可以分为返回值函数和非返回值函数. 函数的定义:函数的定义可以放在任意 ...
- .net 4种单例模式
转载: https://www.cnblogs.com/dreign/archive/2012/05/08/2490212.html using System; using System.Collec ...
- vscode调试适配器已意外终止
出现这个错误了,找半天没找到办法.师兄支了一招: 把图中红圈部分删掉! 这是个旧的配置文件 ,你删掉它(反正一直报错误,也用不成了!).然后你调试一个文件,它会重新自动添加新的配置文件.
- PHP / Laravel 月刊 #23
最新资讯 Laravel 5.6 中文文档翻译完成,译者 60 人,耗时 10 天 Summer Dingo API 中文文档翻译召集[已完成] Summer 我最喜欢 Laravel 5.6 的三个 ...
- SSM登陆注册
package com.coingod.controller; import java.io.IOException;import java.io.PrintWriter;import java.ut ...
- Chrome浏览器vue-devtools插件安装教程
1.打开https://github.com/vuejs/vue-devtools,cmd方式直接输入:git Clone https://github.com/vuejs/vue-devtools. ...