牛客练习赛27 B 手办

版权声明:本文为博主原创文章,爱转载的表明出处就好. 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怎么都不支持啊。。还要在上面找功能。。
真麻烦

题解

这题,很容易搞着搞着就会要求约数和。。
然后分块套分块,是 n 3 4 n^{\frac{3}{4}} ,过不去
如果要写杜教筛的话,想要做到 n 2 3 n^{\frac{2}{3}} ,要处理到 1 0 8 10^8 ,也不支持。。
然后就变成毒瘤题了。。

但其实换一个思路,就不毒瘤了。。
我们可以把f(x)看作 a × b × c = x a\times{b}\times{c}={x} 的个数
那么答案要求的就是 a × b × c < = x a\times{b}\times{c}<={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;
}

 

猜你喜欢

转载自blog.csdn.net/qq_36797743/article/details/82827164