牛客練習賽27 B 手辦
阿新 • • 發佈:2018-12-11
題意
給你一個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; }