【51nod 1847】奇怪的数学题
题目描述
给出 N,K ,请计算下面这个式子:
\(∑_{i=1}^N∑_{j=1}^Nsgcd(i,j)^k\)
其中,sgcd(i, j)表示(i, j)的所有公约数中第二大的,特殊地,如果gcd(i, j) = 1, 那么sgcd(i, j) = 0。
考虑到答案太大,请输出答案对2^32取模的结果.
1≤N≤109,1≤K≤50
样例解释:
因为gcd(i, j)=1时sgcd(i,j)=0对答案没有贡献,所以我们只考虑gcd(i,j)>1的情况.
当i是2时,j是2时,sgcd(i,j)=1,它的K次方是1
当i是2时,j是4时,sgcd(i,j)=1,它的K次方是1
当i是3时,j是3时,sgcd(i,j)=1,它的K次方是1
当i是4时,j是2时,sgcd(i,j)=1,它的K次方是1
当i是4时,j是4时,sgcd(i,j)=2,它的K次方是8
当i是5时,j是5时,sgcd(i,j)=1,它的K次方是1
解题思路
设minp(x)表示x最小的质因子(当x等于1时,minp(x)为0,当x质数时,minp(x)为1)。
于是
\]
\]
\]
对于\(phi(i)\)的前缀和就可以直接杜教筛。
至于如何求出\(\dfrac{d}{minp(d)}\),
当\(d>\sqrt n 且 d为质数\)时,\(\dfrac{d}{minp(d)}\)为1。
这个就可以通过求\(>\sqrt n\)的质数来得出。
我们设
\(F(i,j)表示在[1,j]中,不能被前i个质数整除的数的K次方和\)
\(H(i,j)表示在[1,j]中,不能被前i个质数整除的数的个数\)
\(G(i,j)表示所有x∈[1,j],minp(x)≤p_i,\frac{d}{minp(d)}^K的和\)
于是,我们可以的出一个递推式
\(F(i,j)=F(i-1,j)-p_i^kF(i-1,\lfloor\dfrac{j}{p_i}\rfloor)\)
\(H(i,j)=H(i-1,j)-H(i-1,\lfloor\dfrac{j}{p_i}\rfloor)\)
\(G(i,j)=G(i-1,j)+F(i-1,\lfloor\dfrac{j}{p_i}\rfloor)\)
答案就是\(H(\sqrt n以内质数个数,n)+G(\sqrt n以内质数个数,n)\)
然后我们发现,当\(p_i>j\)时,F(i,j)=1,H(i,j)=1;
当\(p_i^2>j\)时
\(F(i,j)=F(i-1,j)-p_i^k\)
\(H(i,j)=H(i-1,j)-1\)
\(G(i,j)=G(i-1,j)+1\)
因为j只有\(\sqrt n\)种取值,我们直接预处理出每种取值,然后直接递推。
#include <cmath>
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <queue>
#include <map>
const long long inf=2147483647;
const int mo=1e9+7;
const int N=1000005;
const int M=55;
using namespace std;
typedef unsigned int uint;
#define sqr(x) ((x)*(x))
long long _n[N],num,p[N],qn,n,m,SP[N],v1[N],phi[N],nphi[N],nn;
uint F[N],G[N],H[N],lu[N],mi[N],smi[N],s[M][M],S[M],ans,Smi[N];
bool bz[N];
uint poww(uint x,uint y)
{
uint s=1;
for(;y;y>>=1,x=x*x)
if(y&1) s=s*x;
return s;
}
void pre_P()
{
mi[1]=phi[1]=1;
for(int i=2;i<=qn;i++)
{
if(!bz[i])
{
p[++p[0]]=i,phi[i]=i-1,mi[i]=poww(i,m),smi[p[0]]=smi[p[0]-1]+mi[i];
}
for(int j=1;j<=p[0];j++)
{
int k=i*p[j];
if(k>qn) break;
bz[k]=true;
mi[k]=mi[i]*mi[p[j]];
if(i%p[j]==0)
{
phi[k]=phi[i]*p[j];
break;
}
else phi[k]=phi[i]*(p[j]-1);
}
}
for(int i=1;i<=qn;i++) Smi[i]=Smi[i-1]+mi[i],phi[i]+=phi[i-1];
}
void pre_STR()
{
for(int i=0;i<=m;i++) s[i][i]=1;
for(int i=1;i<=m;i++)
for(int j=1;j<i;j++) s[i][j]=s[i-1][j-1]+s[i-1][j]*(i-1);
}
uint get_P(uint n,uint k)
{
uint val=1;
for(uint i=n;i>=n-k+1;i--)
if(i%k==0) val*=i/k;
else val*=i;
return val;
}
void pre()
{
for(uint i=1,last=1;i<=n;i=last+1) last=n/(n/i),_n[++num]=n/i;
reverse(_n+1,_n+1+num);
pre_P(),pre_STR();
for(int i=1;i<=num;i++)
{
H[i]=_n[i];
if(_n[i]<=qn)
{
F[i]=Smi[_n[i]];
continue;
}
S[0]=_n[i];
for(int k=1;k<=m;k++)
{
S[k]=get_P(_n[i]+1,k+1);
for(int j=0;j<k;j++) S[k]-=((k-j)&1?-1:1)*s[k][j]*S[j];
}
F[i]=S[m];
}
}
uint get_F(long long i,long long j)
{
long long k;
k=j<=qn?j:(num-n/j+1);
return (!i || sqr(p[i])<=j)?F[k]:(p[i]<=j?(F[k]-smi[i]+smi[lu[k]]):1);
}
uint get_H(long long i,long long j)
{
long long k;
k=j<=qn?j:(num-n/j+1);
return (!i || sqr(p[i])<=j)?H[k]:(p[i]<=j?(H[k]-i+lu[k])%mo:1);
}
uint Sphi(int n)
{
if(n<=qn) return phi[n];
if(nphi[nn/n]) return nphi[nn/n];
uint ans=(n&1)?((n+1)>>1)*n:(n>>1)*(n+1);
for(int i=2,last=1;i<=n;i=last+1)
{
last=n/(n/i);
ans-=Sphi(n/i)*(last-i+1);
}
return nphi[nn/n]=ans;
}
int main()
{
scanf("%lld%lld",&n,&m),qn=sqrt(n);
pre();
for(int i=1;i<=p[0];i++)
{
for(int j=num;j>=1;j--)
{
F[j]-=mi[p[i]]*get_F(i-1,_n[j]/p[i]);
G[j]+=get_F(i-1,_n[j]/p[i]);
H[j]-=get_H(i-1,_n[j]/p[i]);
lu[j]=i;
if(i==p[0] || sqr(p[i+1])>_n[i])
v1[j]=G[j]+H[j]-1;
if(sqr(p[i])>_n[j-1])
{
v1[j]=G[j]+H[j]-1;
break;
}
}
}
v1[2]=1;
if(_n[3]==3) v1[3]=2;
ans=0;
nn=n;
for(int i=2;i<=num;i++)
ans=ans+(v1[i]-v1[i-1])*(2*Sphi(n/_n[i])-1);
cout<<ans<<endl;
return 0;
}
【51nod 1847】奇怪的数学题的更多相关文章
- [51nod 1847]奇怪的数学题
[ 51nod 1847 ]奇怪的数学题 题目 点这里看题目. 分析 是挺奇怪的...... 以下定义质数集合为\(P\),\(p_i\)为第\(i\)个质数. 定义\(mp(x)\) ...
- 【51NOD 1847】奇怪的数学题(莫比乌斯反演,杜教筛,min_25筛,第二类斯特林数)
[51NOD 1847]奇怪的数学题(莫比乌斯反演,杜教筛,min_25筛,第二类斯特林数) 题面 51NOD \[\sum_{i=1}^n\sum_{j=1}^nsgcd(i,j)^k\] 其中\( ...
- 【51nod 1874】 奇怪的数学题
题目 求 \[\sum_{i=1}^n\sum_{j=1}^nsgcd(i,j)^k\] 首先这个次大公约数显然就是\(gcd\)除一下最小质因子了 于是 \[\sum_{i=1}^n\sum_{j= ...
- 51nod 1965 奇怪的式子——min_25筛
题目:http://www.51nod.com/Challenge/Problem.html#!#problemId=1965 考虑 \( \prod_{i=1}^{n}\sigma_0^i \) \ ...
- [51nod1847]奇怪的数学题
description 51nod 求\[\sum_{i=1}^{n}\sum_{j=1}^{n}sgcd(i,j)^k\]其中\(sgcd(i,j)\)表示\(i,j\)的次大公约数,如果\(gcd ...
- 51nod 1965 奇怪的式子 —— min_25筛
题目:http://www.51nod.com/Challenge/Problem.html#!#problemId=1965 推式子就同这里:https://www.cnblogs.com/yoyo ...
- 【51NOD1847】奇怪的数学题 min_25筛
题目描述 记\(sgcd(i,j)\)为\(i,j\)的次大公约数. 给你\(n\),求 \[ \sum_{i=1}^n\sum_{j=1}^n{sgcd(i,j)}^k \] 对\(2^{32}\) ...
- 【51nod1847】 奇怪的数学题
就当我是 A 了此题吧... 首先预备知识有点多(因为题目要处理的东西都挺毒瘤): 杜教筛运用(当然你可以用其他筛?) 第二类斯特林数相关定理 下降阶乘幂相关定理 min25 筛运用 好了可以关掉本题 ...
- 【51Nod1847】奇怪的数学题
记\(f(x)=\)\(x\)的次大因数,那么\(sgcd(i,j)=f(gcd(i,j))\). 下面来推式子: \[ \begin{aligned} \sum_{i=1}^n\sum_{j=1 ...
随机推荐
- pyhanlp 繁简转换之拼音转换与字符正则化
繁简转换 HanLP几乎实现了所有我们需要的繁简转换方式,并且已经封装到了HanLP中,使得我们可以轻松的使用,而分词器中已经默认支持多种繁简格式或者混合.这里我们不再做过多描述. ·说明 · Han ...
- 阿里云ECS云服务器CentOS部署个人网站
ping了一下coding pages和阿里云服务器的速度,意外感觉coding的速度反而更快.不过为了折腾,还是把博客迁移到阿里云,跌跌撞撞遇到很多坑,大多是由于对指令不熟悉以及部分教程省略了部分步 ...
- winform中如何在多线程中更新UI控件--ListView实时显示执行信息
1.在winform中,所有对UI的操作,都得回到UI线程(主线程)上来,才不会报错 线程间操作无效: 从不是创建控件的线程访问它. 2.在winform中,允许通过Control.invoke对控件 ...
- 牛客 132C 简单瞎搞题 (bitset)
大意: 给定序列$a$的第$i$个元素的取值范围$[L_i,R_i]$, 求$a$的平方和的种类数. 用bitset优化, 复杂度$O(\frac{n^5}{\omega})$ #include &l ...
- 【IntelliJ IDEA】快捷键
1.System.out.println();的快捷方法 sout然后Alt+Enter或者直接点 2.idea上 重写父类方法的快捷键 Ctrl+O之后,在弹出的上面选择要重写的方法 3.idea ...
- webpack权限控制
const type= "a"; const menusConfig = { a: ["activity"], b: ["activity" ...
- js创建点击事件中<a>标签onclick传递多个参数
var rowIndex = e.rowIndex; var t = "<a href='javascript:void(0)' onclick=\"viewInfo('&q ...
- ASP.NET使用AJAX应注意IIS有没有.ashx扩展
项目添加引用AJAX.DLL了:今天将本地做好的一个web程序放到服务器上,居然报告错误了.web程序使用了ajax来往返数据. 检查生成的html语句,有这么两句代码<script type= ...
- 父窗体的委托,子窗体注册,this.Owner是关键
//声明委托 public delegate void RefreshParentHandler<T>(T obj); //父窗体的委托 public RefreshParentHandl ...
- 什么是IOC和什么是AOP,依赖注入(DI)和Ninject,Ninject
我们所需要的是,在一个类内部,不通过创建对象的实例而能够获得某个实现了公开接口的对象的引用.这种“需要”,就称为DI(依赖注入,Dependency Injection),和所谓的IoC(控制反转,I ...