题目:https://loj.ac/problem/572

推式子:https://www.cnblogs.com/cjoieryl/p/10150718.html

又学习了一下杜教筛hh;

原来 unsigned int 的输出是 %u 啊;

注意各处还是要用 (ll),不要不小心都写成 (uint) 了;

然而递归版很慢...

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
typedef unsigned int uint;
typedef long long ll;
int const xn=1e6+;
int n,m,K,pri[xn],cnt,w[xn],sqr;
uint prk[xn],h[xn],G[xn];
bool vis[xn];
uint pw(uint a,int b){uint ret=; for(;b;b>>=,a=a*a)if(b&)ret=ret*a; return ret;}
void init(int mx)
{
for(int i=;i<=mx;i++)
{
if(!vis[i])pri[++cnt]=i,prk[cnt]=pw(i,K);
for(int j=;j<=cnt&&(ll)i*pri[j]<=mx;j++)
{
vis[i*pri[j]]=;
if(i%pri[j]==)break;
}
}
}
int Id(int x)
{
if(x>sqr)return n/x;
return m-x+;
}
uint F(int x,int y)
{
if(pri[y]>x)return ;
uint ret=;
for(int i=y;i<=cnt&&(ll)pri[i]*pri[i]<=x;i++)//ll
for(ll p0=pri[i];p0*pri[i]<=x;p0*=pri[i])
ret+=F(x/p0,i+)+(uint)prk[i]*(h[Id(x/p0)]-i+);
return ret;
}
uint S(int x)
{
if(G[Id(x)]!=-)return G[Id(x)];
uint ret=F(x,)+h[Id(x)];
for(int i=,j;i<=x;i=j+)j=x/(x/i),ret-=(j-i+)*S(x/i);
return G[Id(x)]=ret;
}
int main()
{
scanf("%d%d",&n,&K); sqr=sqrt(n); init(sqr);
for(int i=,j;i<=n;i=j+)
{w[++m]=n/i; j=n/w[m]; h[m]=w[m]-;}
for(int j=;j<=cnt;j++)
for(int i=;i<=m&&(ll)pri[j]*pri[j]<=w[i];i++)
h[i]=h[i]-h[Id(w[i]/pri[j])]+j-;//w[i]
memset(G,-,sizeof G);
uint ans=;
for(int T=,nxt;T<=n;T=nxt+)
{
nxt=n/(n/T);
ans+=(uint)(n/T)*(n/T)*(S(nxt)-S(T-));
}
printf("%u\n",ans);//
return ;
}

递归版

于是写成了循环版,真的变快了^_^

代码如下:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
typedef unsigned int uint;
typedef long long ll;
int const xn=1e6+;
int n,m,K,pri[xn],cnt,w[xn],sqr;
uint prk[xn],h[xn],G[xn],f[xn];
bool vis[xn];
uint pw(uint a,int b){uint ret=; for(;b;b>>=,a=a*a)if(b&)ret=ret*a; return ret;}
void init(int mx)
{
for(int i=;i<=mx;i++)
{
if(!vis[i])pri[++cnt]=i,prk[cnt]=pw(i,K);
for(int j=;j<=cnt&&(ll)i*pri[j]<=mx;j++)
{
vis[i*pri[j]]=;
if(i%pri[j]==)break;
}
}
}
int Id(int x)
{
if(x>sqr)return n/x;
return m-x+;
}
void getf()
{
for(int i=cnt;i;i--)
for(int j=;j<=m&&(ll)pri[i]*pri[i]<=w[j];j++)
for(ll p0=pri[i];p0*pri[i]<=w[j];p0*=pri[i])
f[j]+=f[Id(w[j]/p0)]+(uint)prk[i]*(h[Id(w[j]/p0)]-i+);
}
uint S(int x)
{
if(G[Id(x)]!=-)return G[Id(x)];
uint ret=f[Id(x)]+h[Id(x)];
for(int i=,j;i<=x;i=j+)j=x/(x/i),ret-=(j-i+)*S(x/i);
return G[Id(x)]=ret;
}
int main()
{
scanf("%d%d",&n,&K); sqr=sqrt(n); init(sqr);
for(int i=,j;i<=n;i=j+)
{w[++m]=n/i; j=n/w[m]; h[m]=w[m]-;}
for(int j=;j<=cnt;j++)
for(int i=;i<=m&&(ll)pri[j]*pri[j]<=w[i];i++)
h[i]=h[i]-h[Id(w[i]/pri[j])]+j-;//w[i]
memset(G,-,sizeof G);
uint ans=; getf();
for(int T=,nxt;T<=n;T=nxt+)
{
nxt=n/(n/T);
ans+=(uint)(n/T)*(n/T)*(S(nxt)-S(T-));
}
printf("%u\n",ans);//
return ;
}

loj 572 Misaka Network 与求和 —— min_25筛的更多相关文章

  1. LOJ 572 「LibreOJ Round #11」Misaka Network 与求和——min_25筛

    题目:https://loj.ac/problem/572 莫比乌斯反演得 \( ans=\sum\limits_{D=1}^{n}\left\lfloor\frac{n}{D}\right\rflo ...

  2. [LOJ 572] Misaka Network 与求和

    一.题目 点此看题 二.解法 直接推柿子吧: \[\sum_{i=1}^n\sum_{j=1}^nf(\gcd(i,j))^k \] \[\sum_{d=1}^nf(d)^k\sum_{i=1}^{n ...

  3. 【LOJ#572】Misaka Network 与求和(莫比乌斯反演,杜教筛,min_25筛)

    [LOJ#572]Misaka Network 与求和(莫比乌斯反演,杜教筛,min_25筛) 题面 LOJ \[ans=\sum_{i=1}^n\sum_{j=1}^n f(gcd(i,j))^k\ ...

  4. LOJ572. 「LibreOJ Round #11」Misaka Network 与求和 [莫比乌斯反演,杜教筛,min_25筛]

    传送门 思路 (以下令\(F(n)=f(n)^k\)) 首先肯定要莫比乌斯反演,那么可以推出: \[ ans=\sum_{T=1}^n \lfloor\frac n T\rfloor^2\sum_{d ...

  5. LOJ# 572. 「LibreOJ Round #11」Misaka Network 与求和(min25筛,杜教筛,莫比乌斯反演)

    题意 求 \[ \sum_{i = 1}^{n} \sum_{i = 1}^{n} f(\gcd(i, j))^k \pmod {2^{32}} \] 其中 \(f(x)\) 为 \(x\) 的次大质 ...

  6. Loj#572. 「LibreOJ Round #11」Misaka Network 与求和

    题目 有生之年我竟然能\(A\) 这个题求的是这个 \[\sum_{i=1}^n\sum_{j=1}^nf(gcd(i,j))^k\] \(f(i)\)定义为\(i\)的次大质因子,其中\(f(p)= ...

  7. LOJ572: Misaka Network 与求和

    传送门 假设 \(f^k(i)\) 就是 \(f(i)\) 莫比乌斯反演得到 \[ans=\sum_{i=1}^{N}\lfloor\frac{N}{i}\rfloor^2\sum_{d|i}f(d) ...

  8. loj#6053. 简单的函数(Min_25筛)

    传送门 题解 \(Min\_25\)筛有毒啊--肝了一个下午才看懂是个什么东西-- \(zsy\)巨巨强无敌-- //minamoto #include<bits/stdc++.h> #d ...

  9. Min_25 筛小结

    Min_25 筛这个东西,完全理解花了我很长的时间,所以写点东西来记录一些自己的理解. 它能做什么 对于某个数论函数 \(f\),如果满足以下几个条件,那么它就可以用 Min_25 筛来快速求出这个函 ...

随机推荐

  1. Metasploit 内网渗透篇

    0x01 reverse the shell File 通常做法是使用msfpayload生成一个backdoor.exe然后上传到目标机器执行.本地监听即可获得meterpreter shell. ...

  2. 有谁知道什么工具测试IOS手机上APP的性能软件啊?

    有谁知道什么工具测试IOS手机上APP的性能软件啊?

  3. 鼠标指向表格时 显示更多信息 toolTipController1

    //窗体添加 控件 ,然后将GridControl 相关属性栏对应上新加的控件 切记 本文是转帖,稍作修改 private void toolTipController1_GetActiveObjec ...

  4. java8 函数接口 Predicate例子

    import java.util.HashSet; import java.util.Collection; import java.util.function.Predicate; public c ...

  5. Light oj 1074 spfa

    https://vjudge.net/problem/LightOJ-1074 首先吐槽一个单词,directional是有方向的,undirectional是无向的,这个unidirectional ...

  6. Could not publish server configuration for Tomcat v6.0 Server at localhost.错误问题解决

    经常在使用tomcat服务器的时候 总会发生一些莫名其妙的错误. 就像下面这个错误: 在配置文件中存在多个/MyWeb的配置,导致不能发布服务. 错误信息: Could not publish ser ...

  7. redis 内存库设置 教你怎么解决64位Windows版Redis狂占C盘的问题.

    http://blog.csdn.net/renfufei/article/details/41180007 # heapdir指定内存映射文件路径名,不能是文件名 # heapdir <dir ...

  8. Qt5学习笔记——QRadioButton与QbuttonGroup

    [我是小标题:使用QToolButton实现radio button功能.] QRadioButton是什么?  下图是Windows系统中典型的radio button显示效果.    QRadio ...

  9. 使用flowable 6.1.2 REST API 运行请假审批流程

    一.下载 flowable rest war 包 http://download.csdn.net/detail/teamlet/9913312 二.部署 复制flowable REST.war到To ...

  10. Ganymed实现基本的自动化部署API

    Ganymed SSH-2 for Java是一个纯Java实现的SHH2库,官网为http://www.ganymed.ethz.ch/ssh2/,最新的更新时间为2006年10月,在用之前,请仔细 ...