——題目出處zhoutb2333
題解:3e6可以帶乙個log
又是下取整問題。但是分塊會tle。
這樣考慮,我們把式子拆成兩個部分。
我們先算出來每乙個x的[ai/x]項,再算出來[x/ai]項。之後做和。
[x/ai]:
x和ai的倍數有一些關係。
發現,假設現在x|ai,且x/ai=k, 那麼,對於任意的(x~x+ai-1)[x/ai]=k;
所以,我們可以反過來,對於每乙個ai,列舉ai的倍數,在ai的每個倍數的位置上++,這個桶叫val
那麼,乙個x,[x/ai]的值,就是val[1~x]的和!即乙個字首和。
所以我們外層迴圈i,給ai的倍數打標記 。
但是會被卡,ai=1時,複雜度m^2
所以給ai再開乙個桶,cnt[i]表示值為i的ai有多少個。
列舉i的倍數即可,每次val+=cnt[i],一次加了許多個。
複雜度:m*(1/1+1/2+1/3+...1/m)= mlogm
另外一部分:
[ai/x]
ai和x的倍數有一些關係。
這次就考慮外層列舉x,思路和上面差不多。
列舉x的每乙個倍數j,k=j/x,
那麼,對於數值在(k*x,k*x+x-1)的區間內的所有的ai,[ai/x]=k
把剛才那個桶cnt,進行乙個字首和。
所以,對於這個x,每個倍數j的貢獻是:(sum(k*x+x-1)-sum(k*x-1))*k
複雜度同上。
然後兩邊做和就可以了。
注意:腦殘的一點:n大於2e5的手動構造,mod m再加1,不是mod(m+1)
顯然啊,ai數值不能是(0,m)的,而是(1,m)
**:
#includeusingnamespace
std;
typedef
long
long
ll;const
int n=3000000+4
;ll n,m;
ll a[n];
ll cnt[n],tot;
ll val[n];
ll lp[n];
ll s[n];
intmain()
}else
}for(int i=1;i<=m;i++)
}//for(int i=1;i<=m;i++)
for(int i=1;i<=m;i++)
}ll ans=0
;
for(int i=1;i<=m;i++)
printf(
"%lld
",ans);
return0;
}
JavaScript ECMA 262 深入解析
今天看到一位js大俠的bolg ecma 262大家應該都不陌生吧,陌生就看這裡 ecmascript language specification 要學好js,深入理解ecma 262肯定是必經之路,那麼如何深入理解ecma 262就是乙個要嚴肅對待的問題,狠功夫肯定是要下的,但是也有一些好的資源...
EOJ 莫干山奇遇
出題人當然是希望出的題目有關oxx,於是想方設法給題目配上一些有關oxx的背景故事,使得它看起來不那麼無趣。但有的時候卻無法引入合適的小姐姐,使得oxx顯得非常可憐。所以出題人刪除了故事,只留下乙個枯燥乏味的數學問題。故事已刪除 給乙個長度為n的序列a1,a2,an,求乙個長度為m的序列b1,b2,...
2 6 2 IPSec的實現方式
ipsec的乙個特點就是它可以在共享網路訪問裝置,甚至可以在所有的主機和伺服器上完全實現,這避免了公升級網路裝置的相關費用。ipsec支援2種模式 傳輸模式和隧道模式。傳輸模式 通常在ipsec在一台主機 客戶機或伺服器 上實現時使用,傳輸模式使用原始明文ip頭,並且只加密資料 包括tcp或udp頭...