F. Function! 2019ICPC银川现场赛

it2026-10-03  3

https://nanti.jisuanke.com/t/42386

byf当时没写出来这题情有可原,我也快写了40分钟。。。留下了数学功底薄弱的泪水

观察发现f^-1_{b}_(a)始终为1

然后考虑前面的部分为1*(a^2-a)+2*(a^3-a^2)+...d*(n-a^d),这个东西化简一下就是

d*n+d-a^d-a^(d-1)-...-a^2-a

d可以logn求,前面部分可以直接算,后面部分就是个等比数列求和

然后我们发现当a>sqrt(n)的时候,后面那个式子全是1

于是暴力枚举a=2--sqrt(n),logn算出答案

然后后面的部分就是n*(1)+(n-1)*2....i*(n-i+1)

这个东西用一下那个(1+n)*n/2和(n)*(n+1)*(2*n+1)/6这两个式子就搞完了

总复杂度就是sqrt(n)*logn的

#include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxl=1e6+10; const int mod=998244353; ll n,ans; inline void prework() { scanf("%lld",&n); } inline ll qp(ll a,ll b) { ll ans=1,cnt=a; while(b) { if(b&1) ans=ans*cnt%mod; cnt=cnt*cnt%mod; b>>=1; } return ans; } inline void mainwork() { ll i,x,mi,dec,res;ans=0; for(i=2;i<=n;++i) { if(i*i>n) break; x=i;mi=1; while(x*i<=n) mi++,x*=i; ans=(ans+i*mi%mod*n%mod+i*mi%mod)%mod; dec=i*i%mod*((qp(i,mi)-1+mod)%mod)%mod; dec=dec*qp(i-1,mod-2)%mod; ans=(ans-dec+mod)%mod; } res=(__int128)(n+i)%mod*(n-i+1)%mod*qp(2,mod-2)%mod; res=(__int128)(n+1)%mod*res%mod; dec=(__int128)n%mod*((n+1)%mod)%mod*(2*n+1)%mod*qp(6,mod-2)%mod; dec=(dec-(i-1)*(i)%mod*(2*i-1)%mod*qp(6,mod-2)%mod+mod)%mod; ans=(ans+res-dec+mod)%mod; } inline void print() { printf("%lld\n",ans); } int main() { prework(); mainwork(); print(); return 0; }

 

最新回复(0)