当前位置: 首页 > news >正文

DIVCNT23 - Counting Divisors

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=0;bool fl=false;
    while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
    for(x=numb;isdigit(ch=getchar());x=x*10+numb);
    (fl==true)&&(x=-x);
}
namespace Miracle{
const int N=998630;
ll n;
ul miu[N],sig[N],sq[N];
bool vis[N];
int divcnt[N],pri[N+5],tot;
ll a[200005];
ll up;
void sieve(ll n){
    miu[1]=1;sig[1]=1;
    for(reg i=2;i<=n;++i){
        if(!vis[i]){
            pri[++tot]=i;
            miu[i]=-1;
            sig[i]=2;
            divcnt[i]=1;
        }
        for(reg j=1;j<=tot;++j){
            if(pri[j]*i>n) break;
            vis[pri[j]*i]=1;
            if(i%pri[j]==0){
                divcnt[i*pri[j]]=divcnt[i]+1;
                miu[i*pri[j]]=0;
                sig[i*pri[j]]=sig[i]/(divcnt[i]+1)*(divcnt[i]+2);
                break;
            }
            divcnt[i*pri[j]]=1;
            miu[i*pri[j]]=-miu[i];
            sig[i*pri[j]]=sig[i]*sig[pri[j]];
        }
    }
    sq[1]=1;
    for(reg i=2;i<=n;++i) {
        sq[i]=miu[i]*miu[i];
        sq[i]+=sq[i-1];
         
        sig[i]+=sig[i-1];
    }
}
ul M(ll n){
    if(n<=up) return sq[n];
    ul ret=0;
    for(reg i=1;(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=0;
    for(ll i=1,x=0;i<=n;i=x+1){
        x=(n/(n/i));
        ret=ret+(x-i+1)*(n/i);
    }
//  cout<<" S "<<ret<<endl;
    return ret;
     
}
ul solve(ll n){
    ul ret=0;
    for(ll i=1,x=0;i<=n;i=x+1){
        x=(n/(n/i));
        ret=ret+(M(x)-M(i-1))*S(n/i);
    //  cout<<"["<<i<<","<<x<<"] : "<<ret<<endl;
    }
    return ret;
}
int main(){
    int t;
    rd(t);
    ll mx=0;
    for(reg i=1;i<=t;++i) scanf("%lld",&a[i]),mx=max(mx,a[i]);
    if(mx<=N-5){
        up=mx;
        sieve(up);
    }else{
        up=N-5;
        sieve(up);
    }
    for(reg i=1;i<=t;++i){
        printf("%llu\n",solve(a[i]));
    }
    return 0;
}
 
}
signed main(){
    Miracle::main();
    return 0;
}
 
/*
   Author: *Miracle*
   Date: 2019/3/6 21:18:05
*/
View Code

 

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=0;bool fl=false;
    while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
    for(x=numb;isdigit(ch=getchar());x=x*10+numb);
    (fl==true)&&(x=-x);
}
template<class T>il void ot(T x){x/10?ot(x/10):putchar(x%10+'0');}
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+6;
const int U=2e6+1;
const int K=2;
int vis[N],pri[N],tot;
int cnt;
ll n;
il void sieve(int n){
    for(reg i=2;i<=n;++i){
        if(!vis[i]){
            pri[++tot]=i;
        }
        for(reg j=1;j<=tot;++j){
            if(i*pri[j]>n) break;
            vis[i*pri[j]]=1;
            if(i%pri[j]==0) break;
        }
    }
}
ul f[N];
ll id1[N+233],id2[N+233];
ll val[3*N],num;
il ul G(ll M,int j){
//    cout<<" G "<<M<<" "<<j<<endl;
    if(M<=1||M<pri[j]) return 0;
    int id=(M<=U)?id1[M]:id2[n/M];
    ul ret=f[id]-(ul)(j-1)*(K+1);
    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=1;now*pri[t]<=M;++e,now*=pri[t]){
        //    cout<<" ee "<<e<<endl;
            ret=ret+(ul)(K*e+1)*G(M/now,t+1)+(ul)(K*e+K+1);
        }
    }
//    cout<<" ret "<<M<<" "<<j<<" : "<<ret<<endl;
    return ret;
}
void clear(){
    num=0;cnt=0;
}
int main(){
    int T;
    rd(T);
    sieve(N-5);
    while(T--){
        rd(n);
        if(n==1){
            puts("1");
            continue;
        }
        int ban=sqrt(n);
        cnt=lower_bound(pri+1,pri+tot+1,ban)-pri;
    //    cout<<" cnt "<<cnt<<endl;
        for(ll i=1,x=0;i<=n;i=x+1){
            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=1;i<=num;++i){
            f[i]=(ul)(K+1)*(val[i]-1);
        }
        for(reg j=1;j<=cnt;++j){
        //    cout<<" j ------------- "<<j<<endl;
            for(reg i=1;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+1)*(j-1));
            }
        }
//        for(reg i=1;i<=num;++i){
//            cout<<i<<" : "<<f[i]<<endl;
//        }
        printf("%llu\n",(ul)G(n,1)+1);
        clear();
    }
    return 0;
}

}
signed main(){
    Miracle::main();
    return 0;
}

/*
   Author: *Miracle*
   Date: 2019/3/9 16:39:18
*/
View Code

 

 

 

测试发现

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

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

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

转载于:https://www.cnblogs.com/Miracevin/p/10503166.html

相关文章:

  • 新的博客, 新的里程
  • [学习笔记]Dsu On Tree
  • ExtJS里的Xtype的对应组件
  • 我做SAP CRM One Order redesign的一些心得体会
  • 解决ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)【亲测有效】...
  • 设计模式笔记(4)---生成器模式(创建型)
  • bootstrap
  • C语言单链表实验
  • 2018-11-10 专栏全年主题合辑-代码中文命名相关实践
  • 2009年全国软考网络规划设计师考试大纲
  • 字符串操作、文件操作,英文词频统计预处理
  • 摘抄《天龙八部》诗词回目
  • php项目命名规范
  • Jupyter Notebook不能在系统命令行里全局启动
  • php的基本内容
  • C++11: atomic 头文件
  • create-react-app项目添加less配置
  • DataBase in Android
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • Linux下的乱码问题
  • Lucene解析 - 基本概念
  • mysql_config not found
  • node.js
  • vue-cli3搭建项目
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 精彩代码 vue.js
  • 微服务核心架构梳理
  • 想使用 MongoDB ,你应该了解这8个方面!
  • 项目管理碎碎念系列之一:干系人管理
  • Oracle Portal 11g Diagnostics using Remote Diagnostic Agent (RDA) [ID 1059805.
  • 如何用纯 CSS 创作一个货车 loader
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • # centos7下FFmpeg环境部署记录
  • #if 1...#endif
  • #Z0458. 树的中心2
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • (2015)JS ES6 必知的十个 特性
  • (TipsTricks)用客户端模板精简JavaScript代码
  • (WSI分类)WSI分类文献小综述 2024
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (七)Knockout 创建自定义绑定
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (四) 虚拟摄像头vivi体验
  • *p++,*(p++),*++p,(*p)++区别?
  • .htaccess配置重写url引擎
  • .net 4.0发布后不能正常显示图片问题
  • .NET CLR基本术语
  • .NET Core 2.1路线图
  • .NET Framework与.NET Framework SDK有什么不同?
  • .NET 发展历程
  • .net 怎么循环得到数组里的值_关于js数组
  • .NET/C# 使用 SpanT 为字符串处理提升性能
  • .netcore 如何获取系统中所有session_ASP.NET Core如何解决分布式Session一致性问题
  • .Net环境下的缓存技术介绍