loj 572 Misaka Network 与求和 —— min_25筛
推式子: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筛的更多相关文章
- 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 ...
- [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 ...
- 【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\ ...
- 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 ...
- 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\) 的次大质 ...
- 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)= ...
- LOJ572: Misaka Network 与求和
传送门 假设 \(f^k(i)\) 就是 \(f(i)\) 莫比乌斯反演得到 \[ans=\sum_{i=1}^{N}\lfloor\frac{N}{i}\rfloor^2\sum_{d|i}f(d) ...
- loj#6053. 简单的函数(Min_25筛)
传送门 题解 \(Min\_25\)筛有毒啊--肝了一个下午才看懂是个什么东西-- \(zsy\)巨巨强无敌-- //minamoto #include<bits/stdc++.h> #d ...
- Min_25 筛小结
Min_25 筛这个东西,完全理解花了我很长的时间,所以写点东西来记录一些自己的理解. 它能做什么 对于某个数论函数 \(f\),如果满足以下几个条件,那么它就可以用 Min_25 筛来快速求出这个函 ...
随机推荐
- CNNIC成为首家UASG中国联络站
1月29日,在“2018中国域名大会暨中国互联网络信息中心(CNNIC)行业合作伙伴年会”上获悉,CNNIC日前正式完成与互联网名称与数字地址分配机构(ICANN)的签约,成为首家UASG(普遍接受指 ...
- DevExpress打印通用代码
DevExpress打印相关代码 using System;using System.Windows.Forms;using DevExpress.XtraPrinting;using System. ...
- Python基础笔记系列二:分支和循环
本系列教程供个人学习笔记使用,如果您要浏览可能需要其它编程语言基础(如C语言),why?因为我写得烂啊,只有我自己看得懂!! 分支:即是if-else和if-elif-else语句 循环:即是whil ...
- 《PHP对象、模式与实践》之对象
1.php与对象 知识点: a.关于引用赋值 $other = &$my_obj;//按照引用复制,指向相同对象. 例子: <?php $my_obj = 1; echo $my_obj ...
- C++ 进阶学习 ——模板
模板和重载类似,比重载更省事 通常有两种形式:函数模板和类模板: 函数模板针对仅参数类型不同的函数: 类模板针对仅数据成员和成员函数类型不同的类. 一个简单的函数模板 template <cla ...
- selenium学习笔记(加入unittest)
利用firefox浏览器的selenium IDE可以直接生成webdriver+unittest的python脚本 当然博主是要为了自己编写脚本.对用例内容进行了修改,把元素校验功能也放入了用例中 ...
- yii2:redis调用
参照手册,调用redis,报错,真坑: Yii::$app->redis 后改改用: Yii::getRedis();
- Win7 SP1 下安装 VS2015 Update 3
首先Win7必须是SP1,然后要求安装IE11,安装IE11前需要安装6个先决补丁,成功安装IE11后建议安装3个可选补丁.然后导入3个根证书(COMODO RSA Certification Aut ...
- IOS-环信
一.即时通讯 即时通讯,又称实时通讯 即时通信(Instant Messaging,简称IM)是一个实时通信系统,允许两人或多人使用网络实时的传递文字消息.文件.语音与视频交流 即时通讯在开发中使用的 ...
- ComBox绑定枚举
(转自:http://blog.csdn.net/chao88552828/article/details/9903159) /// <summary> /// 参数枚举 /// < ...