1. 程式人生 > >牛客練習賽27 B 手辦

牛客練習賽27 B 手辦

題意

給你一個n 定義f(x)為a*b整除x的(a,b)個數 求f(1)+f(2)+…+f(n)

廢話

好久沒有更部落格了。。 其實都是寫了沒有發出來。。 你問我為什麼不發出來? 因為寫得都很簡略。。類似題表一樣,記錄一下自己做了哪些題罷了。。 或許等我退役的時候會壓成一個檔案發出來吧。。 話說csdn連手寫的makedown怎麼都不支援啊。。還要在上面找功能。。 真麻煩

題解

這題,很容易搞著搞著就會要求約數和。。 然後分塊套分塊,是n34n^{\frac{3}{4}},過不去 如果要寫杜教篩的話,想要做到n23n^{\frac{2}{3}},要處理到10810^8,也不支援。。 然後就變成毒瘤題了。。

但其實換一個思路,就不毒瘤了。。 我們可以把f(x)看作a×b×c=xa\times{b}\times{c}={x}的個數 那麼答案要求的就是a×b×c<=xa\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;
}