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 筛来快速求出这个函 ...
随机推荐
- yum安装mysql后root用户的临时密码
1.查看root用户临时随机密码 yum 安装mysql后,无法通过空密码登录数据库,如下: [root@ mysql]# mysql -u root -p Enter password: ERROR ...
- iOS 10 系统 AVPlayer视频播放不了问题解决
使用[AVAudioPlayer Play]时出现了异常... 由于xcode中设置了当所有异常出现时的断点,,解决办法是将all改为Objective-C: libc++abi.dylib`__cx ...
- JAVA反序列化漏洞解决办法
一.漏洞描述: 近期,反序列化任意代码执行漏洞持续发酵,越来越多的系统被爆出存在此漏洞.Apache Commons工具集广泛应用于JAVA技术平台,存在Apache Commons Componen ...
- MySQL数据库中tinyint类型字段读取数据为true和false (MySQL的boolean和tinyint(1))
数据库一个表中有一个tinyint类型的字段,值为0或者1,如果取出来的话,0会变成false,1会变成true. MySQL保存boolean值时用1代表TRUE,0代表FALSE.boolean在 ...
- 高亮显示UILabel中的子串
I. 用户在搜索框中,输入关键字进行检索时,APP对搜索结果进行显示,有以下两种情况: 1. 匹配一次,如检索关键字为人名 这种情况,实现比较容易.写一个UILabel的category, 用rang ...
- JavaWeb -- Struts2 构建视图:标签和结果, UI组件标签
1. 示例 action 注入数据 和 处理action /** * OgnlAction */ public class UiAction extends ActionSupport { priva ...
- java sleep()和wait()的区别
java sleep()和wait()的区别? sleep()和wait()都能阻塞当前线程. 区别1: sleep()属于Thread类:wait()属于Object类. 区别2: 调用sleep( ...
- js 小秘密
1.RegExp 对象方法 test检索字符串中指定的值.返回 true 或 false. 支持正则表达式的 String 对象的方法
- RedHat设置Yum源
Linux:RedHat AS 6.2的版本 1.删除原有的yum: rpm -aq | grep yum | xargs rpm -e –nodeps 2.安装新的yum <1>rpm ...
- 为什么font-size推荐使用具体数值?
1.font-size的单位 font-size通常用的单位是px/em/rem,px就不说了,em/rem 主要用在移动端,原因的根据根元素大小进行适配,简而言之,em相对于父级定义基础字号,rem ...