DIVCNT2 - Counting Divisors (square)

DIVCNT3 - Counting Divisors (cube)

杜教筛

[学习笔记]杜教筛

(其实不算是杜教筛,类似杜教筛的复杂度分析而已)

你要大力推式子:

把约数个数代换了

把2^质因子个数 代换了

构造出卷积,然后大于n^(2/3)还要搞出约数个数的式子和无完全平方数的个数的容斥。。。

。。。。

然后恭喜你,spoj上过不去。。。

bzoj能过:

#include<bits/stdc++.h>
#define reg register int
#define il inline
#define ul unsigned long long
#define numb (ch^'0')
using namespace std;
typedef long long ll;
il void rd(int &x){
char ch;x=;bool fl=false;
while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
for(x=numb;isdigit(ch=getchar());x=x*+numb);
(fl==true)&&(x=-x);
}
namespace Miracle{
const int N=;
ll n;
ul miu[N],sig[N],sq[N];
bool vis[N];
int divcnt[N],pri[N+],tot;
ll a[];
ll up;
void sieve(ll n){
miu[]=;sig[]=;
for(reg i=;i<=n;++i){
if(!vis[i]){
pri[++tot]=i;
miu[i]=-;
sig[i]=;
divcnt[i]=;
}
for(reg j=;j<=tot;++j){
if(pri[j]*i>n) break;
vis[pri[j]*i]=;
if(i%pri[j]==){
divcnt[i*pri[j]]=divcnt[i]+;
miu[i*pri[j]]=;
sig[i*pri[j]]=sig[i]/(divcnt[i]+)*(divcnt[i]+);
break;
}
divcnt[i*pri[j]]=;
miu[i*pri[j]]=-miu[i];
sig[i*pri[j]]=sig[i]*sig[pri[j]];
}
}
sq[]=;
for(reg i=;i<=n;++i) {
sq[i]=miu[i]*miu[i];
sq[i]+=sq[i-]; sig[i]+=sig[i-];
}
}
ul M(ll n){
if(n<=up) return sq[n];
ul ret=;
for(reg i=;(ll)i*i<=n;++i){
ret=ret+miu[i]*(n/(i*i));
}
//cout<<" M "<<ret<<endl;
return ret; }
ul S(ll n){
if(n<=up) return sig[n];
ul ret=;
for(ll i=,x=;i<=n;i=x+){
x=(n/(n/i));
ret=ret+(x-i+)*(n/i);
}
// cout<<" S "<<ret<<endl;
return ret; }
ul solve(ll n){
ul ret=;
for(ll i=,x=;i<=n;i=x+){
x=(n/(n/i));
ret=ret+(M(x)-M(i-))*S(n/i);
// cout<<"["<<i<<","<<x<<"] : "<<ret<<endl;
}
return ret;
}
int main(){
int t;
rd(t);
ll mx=;
for(reg i=;i<=t;++i) scanf("%lld",&a[i]),mx=max(mx,a[i]);
if(mx<=N-){
up=mx;
sieve(up);
}else{
up=N-;
sieve(up);
}
for(reg i=;i<=t;++i){
printf("%llu\n",solve(a[i]));
}
return ;
} }
signed main(){
Miracle::main();
return ;
} /*
Author: *Miracle*
Date: 2019/3/6 21:18:05
*/

Min_25筛

sigma(i^3)是积性函数!

没了。

#include<bits/stdc++.h>
#define reg register int
#define il inline
#define fi first
#define se second
#define ul unsigned long long
#define mk(a,b) make_pair(a,b)
#define int long long
#define numb (ch^'0')
using namespace std;
typedef long long ll;
template<class T>il void rd(T &x){
char ch;x=;bool fl=false;
while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
for(x=numb;isdigit(ch=getchar());x=x*+numb);
(fl==true)&&(x=-x);
}
template<class T>il void ot(T x){x/?ot(x/):putchar(x%+'');}
template<class T>il void prt(T a[],int st,int nd){for(reg i=st;i<=nd;++i) printf("%lld ",a[i]);putchar('\n');} namespace Miracle{
const int N=2e6+;
const int U=2e6+;
const int K=;
int vis[N],pri[N],tot;
int cnt;
ll n;
il void sieve(int n){
for(reg i=;i<=n;++i){
if(!vis[i]){
pri[++tot]=i;
}
for(reg j=;j<=tot;++j){
if(i*pri[j]>n) break;
vis[i*pri[j]]=;
if(i%pri[j]==) break;
}
}
}
ul f[N];
ll id1[N+],id2[N+];
ll val[*N],num;
il ul G(ll M,int j){
// cout<<" G "<<M<<" "<<j<<endl;
if(M<=||M<pri[j]) return ;
int id=(M<=U)?id1[M]:id2[n/M];
ul ret=f[id]-(ul)(j-)*(K+);
for(reg t=j;t<=cnt&&(ll)pri[t]*pri[t]<=M;++t){
ul now=pri[t];
// cout<<" mindiv "<<t<<" : "<<now<<endl;
for(reg e=;now*pri[t]<=M;++e,now*=pri[t]){
// cout<<" ee "<<e<<endl;
ret=ret+(ul)(K*e+)*G(M/now,t+)+(ul)(K*e+K+);
}
}
// cout<<" ret "<<M<<" "<<j<<" : "<<ret<<endl;
return ret;
}
void clear(){
num=;cnt=;
}
int main(){
int T;
rd(T);
sieve(N-);
while(T--){
rd(n);
if(n==){
puts("");
continue;
}
int ban=sqrt(n);
cnt=lower_bound(pri+,pri+tot+,ban)-pri;
// cout<<" cnt "<<cnt<<endl;
for(ll i=,x=;i<=n;i=x+){
x=(n/(n/i));
val[++num]=n/i;
if(n/i<=U) id1[n/i]=num;
else id2[x]=num;
}
// cout<<" num "<<num<<endl;
for(reg i=;i<=num;++i){
f[i]=(ul)(K+)*(val[i]-);
}
for(reg j=;j<=cnt;++j){
// cout<<" j ------------- "<<j<<endl;
for(reg i=;i<=num;++i){
if((ll)pri[j]*pri[j]>val[i]) break;
int fr=val[i]/pri[j]<=U?id1[val[i]/pri[j]]:id2[n/(val[i]/pri[j])];
//cout<<" fr "<<fr<<endl;
f[i]=f[i]-(f[fr]-(ul)(K+)*(j-));
}
}
// for(reg i=1;i<=num;++i){
// cout<<i<<" : "<<f[i]<<endl;
// }
printf("%llu\n",(ul)G(n,)+);
clear();
}
return ;
} }
signed main(){
Miracle::main();
return ;
} /*
Author: *Miracle*
Date: 2019/3/9 16:39:18
*/

测试发现

Min_25在n<=1e12时候基本都是比杜教筛快。

在N<=1e9时候更是秒出

但是数据组数多了以后,杜教筛记忆化的优势就体现明显了。

DIVCNT2&&3 - Counting Divisors的更多相关文章

  1. SPOJ 20713 DIVCNT2 - Counting Divisors (square)

    DIVCNT2 - Counting Divisors (square) #sub-linear #dirichlet-generating-function Let \sigma_0(n)σ​0​​ ...

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

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

  3. HDU 6069 Counting Divisors

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

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

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

  5. hdu 6069 Counting Divisors 筛法

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

  6. 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 ...

  7. hdu6069 Counting Divisors 晒区间素数

    /** 题目:hdu6069 Counting Divisors 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6069 题意:求[l,r]内所有数的k次方 ...

  8. HDU 6069 Counting Divisors —— 2017 Multi-University Training 4

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

  9. 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&= ...

随机推荐

  1. Docker 小记 — Docker Engine

    前言 用了 Docker 方才觉得生产环境终于有了他该有的样子,就像集装箱普及之后大型货轮的价值才逐渐体现出来,Docker 详细说明可查阅"官方文档".本篇为 Docker En ...

  2. [2019校招] - Java多线程面试题总结

    Object 的 wait()和notify() 方法 下图为线程状态的图: Object 对象中的 wait()和notify()是用来实现实现等待 / 通知模式.其中等待状态和阻塞状态是不同的.等 ...

  3. WordPress更新提示无法创建目录的解决方案

    上一篇我们说到无法连接FTP服务器,我们已经完美的解决了,然后...发现...还是无法更新,啥情况??? 提示为无法创建目录 原因是执行更新程序的是www用户, 解决方案如下: 需要把插件或主程序下载 ...

  4. WordPress更新时提示无法连接到FTP服务器的解决方案

    这几天在搭建主站的时候,更新wordpress时无法连接到FTP原因服务器 解决方法如下: 在WordPress目录下找到wp-config.php文件并编辑,在最后一行加上: define('FS_ ...

  5. Docker容器学习梳理 - 基础知识(2)

    之前已经总结了Docker容器学习梳理--基础知识(1),但是不够详细,下面再完整补充下Docker学习的一些基础. Docker是个什么东西 Docker是一个程序运行.测试.交付的开放平台,Doc ...

  6. mysql操作命令梳理(2)-alter(update、insert)

    在mysql运维操作中会经常使用到alter这个修改表的命令,alter tables允许修改一个现有表的结构,比如增加或删除列.创造或消去索引.改变现有列的类型.或重新命名列或表本身,也能改变表的注 ...

  7. C_数据结构_数组

    //数组 # include <stdio.h> # include <malloc.h> //包含了 malloc 函数 # include <stdlib.h> ...

  8. SoftwareEngineering Individual Project - Word frequency program

    说实话前面c#实在没怎么学过.这次写起来感觉非常陌生,就连怎么引用名空间都忘记了.在经过恶补后还是慢慢地适应了. 1.项目预计用时: 构建并写出大概的数据结构,程序框架及模块: 30min 实现文件夹 ...

  9. 第五届蓝桥杯C++B组 地宫取宝

    代码: #include <bits/stdc++.h> using namespace std; #define ll long long const ll mod = 1e9 + 7; ...

  10. [书摘]HTTPS--From图解HTTP

    1.  HTTP存在的安全性风险: 1) 通信过程使用明文,容易被窃听 2) 不验证通信方的身份,可能遭遇伪装 3) 不验证通信数据包的完整性,可能遭遇篡改 2. HTTP+加密+认证+完整性保护=H ...