版权声明:转载注明下出处就行了。 https://blog.csdn.net/LJD201724114126/article/details/82751920
整数分块参考博客,很重要:http://www.cnblogs.com/0xfffe/p/9648943.html
有个问题:
求 ,
直接做肯定T
我们打表之后发现有如下性质:
1, 最多有 种。
证明:对于 ,只有 种,对于 , 。
扫描二维码关注公众号,回复:
3943293 查看本文章
///数论分块 参考博客:http://www.cnblogs.com/0xfffe/p/9648943.html
///https://www.cnblogs.com/hehe54321/p/9298945.html
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long LL;
const LL mod=998244353;
LL sum(LL x)
{
return x*(x+1)%mod*(2*x+1)%mod*166374059%mod;///求前1^2+2^2+3^2+4^2+... 和
}
int main()
{
LL n,ans;
LL a0,a1,a2;
while(~scanf("%lld",&n))
{
a0=a1=a2=0;
LL i,j;
for( i=1;i<=n;i=j+1)
{
LL item=n/i;
j=n/item; ///j表示从i到j,其n/i都是相等的,这是数论分块
a0=(a0+(j-i+1)*item)%mod; ///有(j-i+1)个item值
a1=(a1+(i+j)*(j-i+1)%mod*499122177%mod*item%mod)%mod;///连续的从i到j,其n/i都想等,等差数列求和就行了
a2=(a2+(sum(j)-sum(i-1)+mod)%mod*item%mod)%mod;///公式求前平方和
}
printf("%lld\n",(2*a2%mod+3*a1%mod+5*a0%mod)%mod);
}
return 0;
}