宁夏区域赛f题
不会插入公式!!
求 sum(a=2->n)sum(b=a->n)a*log a(b),结果对998244353取模
n的范围:n<=1e12
loga (b)向下取整。
解析:
n的范围非常大,但如果a>sqrt(n),呢么loga(b)只为1.
所以我们预处理sqrt(n)产生的影响
对于(sqrt(n)+1,n),我们另外直接计算
for(int i=sqrt(n)+1;i<=n;i++)
ans+=i*(n-i+1);
n非常大,显然不能直接算
对于ai=i*i这个数列,有个公式求和,si=(i+1)*(2*i+1)*(i)/6;
对于ai=i*i,列处1-10项,然后连续作差,最后为0,得出结论为一个1元3次式,解除si=1/3*i^3+1/2*i*i+1/6*i;
然后用逆元直接算就可以了
ac:
#include<bits/stdc++.h>
#define mod 998244353
#define ll long long
using namespace std;
ll ans=0;
ll finv(ll a,ll b)
{
ll res=1;
b=b-2;
while(b)
{
if(b&1)
res=res*a%mod;
a=a*a%mod;
b>>=1;
}
return res;
}
void init(ll n)
{
ll tt=1;
for(ll i=2;i*i<=n;i++)
{
ll st=i,gg=i,sum=0,kk=i;
while(gg<=n)
{
gg=st*i;
if(gg>n){
sum=(sum+((n%mod-st+1+mod)%mod*kk)%mod)%mod;
break;
}
sum=(sum+((gg%mod-st+mod)%mod*kk)%mod)%mod;
st=gg;
kk+=i;
}
ans=(ans+sum)%mod;
tt=i;
}
//ll cc=(n-tt)*(tt+1+n)*(n+1)*finv(2,mod);
//ll aa=n*(n+1)*(2*n+1)*finv(6,mod);
//ll bb=tt*(tt+1)*(2*tt+1)*finv(6,mod);
//ans=ans-(aa-bb);
//ans=ans+cc;
ll cc=(n-tt)%mod+mod; cc=cc%mod;
cc=cc*((tt+1+n)%mod); cc=cc%mod;
cc=cc*((n+1)%mod); cc=cc%mod;
cc=cc*finv(2,mod); cc=cc%mod;
ll aa=n%mod;
aa=aa*((n+1)%mod); aa=aa%mod;
aa=aa*((2*n+1)%mod); aa=aa%mod;
aa=aa*finv(6,mod); aa=aa%mod;
ll bb=tt%mod;
bb=bb*((tt+1)%mod); bb=bb%mod;
bb=bb*((2*tt+1)%mod); bb=bb%mod;
bb=bb*finv(6,mod); bb=bb%mod;
ans=(ans-(aa-bb+mod)%mod+mod)%mod;
ans=(ans+cc)%mod;
}
int main()
{
ll n;
ans=0;
cin>>n;
init(n);
cout<<ans<<endl;
return 0;
}
/*
1000000000000
*/