版权声明:本文为博主原创文章,爱转载的表明出处就好. https://blog.csdn.net/qq_36797743/article/details/82827164
题意
给你一个n
定义f(x)为a*b整除x的(a,b)个数
求f(1)+f(2)+…+f(n)
废话
好久没有更博客了。。
其实都是写了没有发出来。。
你问我为什么不发出来?
因为写得都很简略。。类似题表一样,记录一下自己做了哪些题罢了。。
或许等我退役的时候会压成一个文件发出来吧。。
话说csdn连手写的makedown怎么都不支持啊。。还要在上面找功能。。
真麻烦
题解
这题,很容易搞着搞着就会要求约数和。。
然后分块套分块,是
,过不去
如果要写杜教筛的话,想要做到
,要处理到
,也不支持。。
然后就变成毒瘤题了。。
但其实换一个思路,就不毒瘤了。。
我们可以把f(x)看作
的个数
那么答案要求的就是
规定一下顺序。。
排列一下就可以算出来了。。
复杂度并不会证
但肯定比前面那两个快。。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
typedef long long LL;
const LL MOD=2333;
LL dec (LL x,LL y) {x=x-y;if (x<0) x=x+MOD;return x;}
LL add (LL x,LL y) {x=x+y;if (x>=MOD) x=x-MOD;return x;}
LL mul (LL x,LL y) {return x*y%MOD;}
int main()
{
LL n;
scanf("%lld",&n);
LL ans=0;
for (LL u=1;u*u*u<=n;u++)
{
ans=add(ans,1);
ans=add(ans,mul(n/u/u-u,3));
for (LL i=u+1;i*u*i<=n;i++)
{
ans=add(ans,3);
ans=add(ans,mul(n/i/u-i,6));
}
}
printf("%lld\n",ans);
return 0;
}