【SPOJ】DIVCNTK min_25筛
题目大意
给你 \(n,k\),求
\]
对 \(2^{64}\) 取模。
题解
一个min_25筛模板题。
令 \(f(n)=\sigma_0(n^k)\),那么 \(S_k(n)=\sum_{i=1}^nf(i)\),而且
f(1)&=1\\
f(p)&=k+1\\
f(p^c)&=kc+1
\end{cases}
\]
直接上min_25筛就好了。
时间复杂度:\(O(\frac{n^\frac{3}{4}}{\log n})\)
某些实现可能会有一点微小的细节。
代码
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<ctime>
#include<utility>
#include<functional>
#include<cmath>
#include<assert.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
void open(const char *s){
#ifndef ONLINE_JUDGE
char str[100];sprintf(str,"%s.in",s);freopen(str,"r",stdin);sprintf(str,"%s.out",s);freopen(str,"w",stdout);
#endif
}
int rd(){int s=0,c,b=0;while(((c=getchar())<'0'||c>'9')&&c!='-');if(c=='-'){c=getchar();b=1;}do{s=s*10+c-'0';}while((c=getchar())>='0'&&c<='9');return b?-s:s;}
void put(int x){if(!x){putchar('0');return;}static int c[20];int t=0;while(x){c[++t]=x%10;x/=10;}while(t)putchar(c[t--]+'0');}
int upmin(int &a,int b){if(b<a){a=b;return 1;}return 0;}
int upmax(int &a,int b){if(b>a){a=b;return 1;}return 0;}
const int M=100010;
int pri[M],cnt,b[M];
ll f1[M],f2[M];
void init()
{
for(int i=2;i<=100000;i++)
{
if(!b[i])
pri[++cnt]=i;
for(int j=1;j<=cnt&&i*pri[j]<=100000;j++)
{
b[i*pri[j]]=1;
if(i%pri[j]==0)
break;
}
}
pri[cnt+1]=100001;
}
ll n,k;
int m;
ll dfs(ll x,int y)
{
if(x<=1||x<pri[y])
return 0;
if(pri[y]>m)
return (x<=m?f1[x]:f2[n/x])-f1[m];
ll s=(x<=m?f1[x]:f2[n/x])-f1[pri[y]-1];
for(int i=y;i<=cnt&&(ll)pri[i]*pri[i]<=x;i++)
{
ll x1=x/pri[i];
for(int j=1;x1>=pri[i];j++,x1/=pri[i])
s+=dfs(x1,i+1)*(j*k+1)+((j+1)*k+1);
}
return s;
}
void solve()
{
scanf("%lld%lld",&n,&k);
m=sqrt(n)+0.5;
int mx=n/(m+1);
for(int i=2;i<=m;i++)
f1[i]=i-1;
for(int i=1;i<=mx;i++)
f2[i]=n/i-1;
for(int i=1;i<=cnt&&pri[i]<=m;i++)
{
ll x=f1[pri[i]-1];
int n1=min((ll)mx/pri[i],n/pri[i]/pri[i]);
int n2=min((ll)mx,n/pri[i]/pri[i]);
for(int j=1;j<=n1;j++)
f2[j]-=f2[j*pri[i]]-x;
for(int j=n1+1;j<=n2;j++)
f2[j]-=f1[n/j/pri[i]]-x;
for(int j=m;j>=(ll)pri[i]*pri[i];j--)
f1[j]-=f1[j/pri[i]]-x;
}
for(int i=2;i<=m;i++)
f1[i]*=k+1;
for(int i=1;i<=mx;i++)
f2[i]*=k+1;
ll ans=dfs(n,1);
ans++;
printf("%llu\n",ans);
}
int main()
{
open("divcntk");
int t;
scanf("%d",&t);
init();
while(t--)
solve();
return 0;
}
【SPOJ】DIVCNTK min_25筛的更多相关文章
- Min_25 筛小结
Min_25 筛这个东西,完全理解花了我很长的时间,所以写点东西来记录一些自己的理解. 它能做什么 对于某个数论函数 \(f\),如果满足以下几个条件,那么它就可以用 Min_25 筛来快速求出这个函 ...
- min_25 筛学习小记
min_25筛 由 dalao min_25 发明的筛子,据说时间复杂度是极其优秀的 \(O(\frac {n^{\frac 3 4}} {\log n})\),常数还小. 1. 质数 \(k\) 次 ...
- 【UOJ448】【集训队作业2018】人类的本质 min_25筛
题目大意 给你 \(n,m\),求 \[ \sum_{i=1}^n\sum_{x_1,x_2,\ldots,x_m=1}^i\operatorname{lcm}(\gcd(i,x_1),\gcd(i, ...
- Min_25 筛 学习笔记
原文链接https://www.cnblogs.com/zhouzhendong/p/Min-25.html 前置技能 埃氏筛法 整除分块(这里有提到) 本文概要 1. 问题模型 2. Min_25 ...
- UOJ188 Sanrd Min_25筛
传送门 省选之前做数论题会不会有Debuff啊 这道题显然是要求\(1\)到\(x\)中所有数第二大质因子的大小之和,如果不存在第二大质因子就是\(0\) 线性筛似乎可以做,但是\(10^{11}\) ...
- 【51NOD1847】奇怪的数学题 min_25筛
题目描述 记\(sgcd(i,j)\)为\(i,j\)的次大公约数. 给你\(n\),求 \[ \sum_{i=1}^n\sum_{j=1}^n{sgcd(i,j)}^k \] 对\(2^{32}\) ...
- 【51NOD1965】奇怪的式子 min_25筛
题目描述 给你\(n\),求 \[ \prod_{i=1}^n{\sigma_0(i)}^{i+\mu(i)} \] 对\({10}^{12}+39\)取模. \(\sigma_0(i)\)表示约数个 ...
- min_25筛
min_25筛 用来干啥? 考虑一个积性函数\(F(x)\),用来快速计算前缀和\[\sum_{i=1}^nF(i)\] 当然,这个积性函数要满足\(F(x),x\in Prime\)可以用多项式表示 ...
- 关于 min_25 筛的入门以及复杂度证明
min_25 筛是由 min_25 大佬使用后普遍推广的一种新型算法,这个算法能在 \(O({n^{3\over 4}\over log~ n})\) 的复杂度内解决所有的积性函数前缀和求解问题(个人 ...
随机推荐
- Vue-指令
1. v-text:这个指令用于将vue实例中的data内的属性渲染到标签内.有两种写法: 1. `<div v-text="数据"></div>`:该写法 ...
- selenium chrome在新标签页打开链接的方法
目前chrome是我在实现webdriver时运行最稳定的浏览器,如何利用webdriver打开多个标签页和链接呢,到处查找得到的往往只是如何打开标签页.打开标签页很简单,chrome浏览器打开标签页 ...
- docker安装wnameless/oracle-xe-11g并运行(手写超详细)
前景:没事想玩下linux,想着以后可以部署下自己的web项目上去,然后我就想装个oracle来着...之前都不懂linux来着,只知道公司的项目都是部署在上面,然后从装系统到装完oracle用了近五 ...
- 记录CentOS 7.4 上安装MySQL&MariaDB&Redis&Mongodb
记录CentOS 7.4 上安装MySQL&MariaDB&Redis&Mongodb 前段时间我个人Google服务器意外不能用,并且我犯了一件很低级的错误,直接在gcp讲服 ...
- PM真的不是PM
上周写了一篇<PM意识2.0>,前同事老A留言给我说:“PM已死!”一句话勾起很多回忆啊~当年,我们在一家内资IT公司,我是质量总监,他是研发总监,带四五个PM.老A负责所有项目的计划和监 ...
- [翻译]:MySQL Error: Too many connections
翻译:MySQL Error: Too many connections 前言: 本文是对Muhammad Irfan的这篇博客MySQL Error: Too many connections的 ...
- c# winform多线程实时更新控件
//创建委托 private delegate void SetTextCallback(string text); /// <summary> / ...
- SQLServer之删除视图
删除视图注意事项 删除视图时,将从系统目录中删除视图的定义和有关视图的其他信息. 还将删除视图的所有权限. 使用 DROP TABLE 删除的表上的任何视图都必须使用 DROP VIEW 显式删除. ...
- 戏说春秋_i春秋 writeup
<戏说春秋>第一关 图穷匕见 题目: 解:用winhex打开,拉到最后可发现一段编码 放到解密网站上解码. <戏说春秋>第二关 纸上谈兵 解:文中没有明确指出问题,也没有给出线 ...
- 初学python列表
首先我定义了一个列表 a = [2,3,3,5,6,7,9] 我想对列表a 的每个值都加一,哈,脑子里顿时闪过一道光 ①首先我想到的是用for 循环来进行加一,即以下代码 a = [2,3,3,5,6 ...