题目: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. Linux系统下Git操作命令整理

    1.显示当前的配置信息 git config --list 2. 创建repo从别的地方获取 git clone git://git.kernel.org/pub/scm/git/git.git 自己 ...

  2. nginx上布置thinkphp

    thinkphp config配置: ', //URL模式 nginx rewrite配置: location / {        set $static 0;        if  ($uri ~ ...

  3. ik分词器

    ik分词器下载地址:https://code.google.com/archive/p/ik-analyzer/downloads 需要FQ 配置文件: IKAnalyzer2012.jar(主 ja ...

  4. LeetCode第[2]题(Java):Add Two Numbers (链表相加)——Medium

    题目难度:Medium 题目: You are given two non-empty linked lists representing two non-negative integers. The ...

  5. org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource [bean.xml]: Invocation of init method failed; nested exception is

    在复制xml文件进行修改的时候,我经常将不小心对原文件进行修改,而导致创建bean出错.报错如下所示: Exception sending context initialized event to l ...

  6. vmware配置网卡

    虚拟机网络配置 1. 启用VMWare虚拟网卡 如果没有查看到vmnet8这个网络连接,打开VMWare, 2. 设置虚拟机:选中安装好的虚拟机右键设置. 3. 设置虚拟机系统. 指令:vi /etc ...

  7. 遍历jsonArray和jsonObject

    遍历jsonArray String str = "[{name:'a',value:'aa'},{name:'b',value:'bb'},{name:'c',value:'cc'}]&q ...

  8. 51nod 1406 位运算/dp

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1406 1406 与查询 题目来源: CodeForces 基准时间限制: ...

  9. 014——VUE中v-if语法在网站注册中的实际应用

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  10. IIC时序图