【BZOJ4916】神犇和蒟蒻 杜教筛
题目传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4916
第一个询问即求出∑ni=1μ(i2),考虑到μ的定义,当i>1时必存在次数为偶数的质因子,故在数据范围内,∑ni=1μ(i2)恒等于1。
第二个询问即求出∑ni=1φ(i2),考虑到φ的定义,则有φ(i2)=i×φ(i)。
问题转化为求∑ni=1i×φ(i)
下面开始化简式子,考虑式子n=∑i|nφ(i)
通过简单变式,得:n=∑i|n&i<nφ(i)+φ(n)
移项,得:φ(n)=n−∑i|n&i<nφ(i)
通过之前推出的式子,得:μ(n2)=n2−n×∑i|n&i<nμ(i)
我们设Φ(n)=∑ni=1φ(i2)
则:
Φ(n)=∑ni=1(i2−i×∑j|i&j<iφ(j))
=n(n+1)(2n+1)6−∑ni=1i×∑j|i&j<iφ(j)
=n(n+1)(2n+1)6−∑ni=2i×∑⌊ni⌋j=1φ(j)×j
=n(n+1)(2n+1)6−∑ni=2i×Φ(⌊ni⌋)
然后用杜教筛的思路+预处理1~19260817的i×μ(i)的前缀和即可
1 #include<bits/stdc++.h> 2 #define L long long 3 #define M 19260817 4 #define MOD 1000000007 5 #define inv6 166666668 6 using namespace std; 7 8 int b[M]={0},phi[M]={0},use=0; L pri[M]={0}; 9 void init(){ 10 phi[1]=1; 11 for(int i=2;i<M;i++){ 12 if(!b[i]) pri[++use]=i,phi[i]=i-1; 13 for(int j=1;j<=use&&i*pri[j]<M;j++){ 14 b[i*pri[j]]=1; 15 if(i%pri[j]==0) {phi[i*pri[j]]=phi[i]*pri[j]; break;} 16 phi[i*pri[j]]=phi[i]*(pri[j]-1); 17 } 18 } 19 for(L i=1;i<M;i++) phi[i]=(phi[i-1]+phi[i]*i)%MOD; 20 } 21 22 map<int,L> mp; 23 L solve(L n){ 24 if(n<M) return phi[n]; 25 if(mp[n]) return mp[n]; 26 L pls=n*(n+1)%MOD*(n<<1|1)%MOD*inv6%MOD,ans=0; 27 for(L i=2,j;i<=n;i=j+1){ 28 j=n/(n/i); 29 L sumi=((i+j)*(j-i+1)/2)%MOD; 30 ans=(ans+solve(n/i)%MOD*sumi)%MOD; 31 } 32 ans=(pls-ans+MOD)%MOD; 33 return mp[n]=ans; 34 } 35 36 int main(){ 37 init(); 38 int n; scanf("%d",&n); printf("1\n"); 39 printf("%lld\n",solve(n)); 40 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!