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. vim-plug 插件安装与操作

    安装 vim-plug curl -fLo ~/.vim/autoload/plug.vim --create-dirs https://raw.githubusercontent.com/juneg ...

  2. Vue2.0 搭配 axios

    1.安装axios $ npm install axios 2.Demo (1)Get // 为给定 ID 的 user 创建请求 axios.get('/user?ID=12345') .then( ...

  3. ssh实现办公室电脑连接家中的电脑

    友情提示:如果您不知道您家路由器管理页面的密码,请您忽略此文. 问题背景: 家中有台笔记本电脑,它是通过家中的路由器与外界联网的,这时,我想通过ssh服务让公司的电脑能连上我家中的笔记本. 可以画个图 ...

  4. linux-文件流4种读取方式

    第二种方式 第三种 第四种: 小括号在管道符的右边开辟了两个子进程 大括号在管道符的右边开辟了一个子进程, export 用来导出子进程的 num 还可以借助外部文件进行 七步扩展:

  5. C_数据结构_数组的修改和删除

    #include<stdio.h> typedef struct Node { int a,b; }node; node c[]; int n; void print() { int i; ...

  6. 成功安装的Sublime Text3

    安装指南 1:下载官网:https://www.sublimetext.com/3 2:安装指南:https://jingyan.baidu.com/article/b0b63dbfe1b8ff4a4 ...

  7. PHP magic_quotes_gpc 和 addslashes解析

    默认情况下,PHP 指令 magic_quotes_gpc 为 on,它主要是对所有的 GET.POST 和 COOKIE 数据自动运行 addslashes().不要对已经被 magic_quote ...

  8. QQ使用的使用评价

    1:界面以及功能:打开软件之后探出登录窗口,基本功能的登录,找回密码,注册帐号等功能均在比较醒目的位置,界面较为友好. 将注册帐号放在打开软件的第一界面当然是正确的选择,给予用户非常直观的提示(没有帐 ...

  9. spring引入HikariCP连接池

    1.导入jar包 2.applicationContext.xml中配置 <bean id="dataSource" class="com.zaxxer.hikar ...

  10. html之间传递参数

    转自:http://blog.163.com/yangzhanghui_job/blog/static/179575062201271624839972/ aa.html 往 bb.html 传参 a ...