现在的位置: 首页 > 综合 > 正文

BZOJ 1968 AHOI 2005 COMMON 约数研究 线性筛/暴力

2018年01月19日 ⁄ 综合 ⁄ 共 1321字 ⁄ 字号 评论关闭

题目大意:设f(i)为i的约数个数,求f的前缀和。

思路:暴力是O(n*sqrt(n)),大概过不去。看这数据范围应该就是线性筛没跑了,但是我不会筛约数个数。于是在暴力上面加一点点打表。吧1w到1kw之间10000的倍数的答案打出表,然后剩下10000暴力就好了。

CODE(丑陋的打表):

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;

int ans[] = {0,93668,201177,313925,430062,548725,669422,791780,915548,1040630,1166750,1293935,1421996,1550902,1680578,1810953,1942002,2073666,2205986,2338763,2472113,2606008,2740315,2875085,3010305,3145958,3281973,3418435,3555195,3692338,3829833,3967622,4105787,4244274,4382991,4522065,4661460,4801042,4940922,5081120,5221472,5362138,5503108,5644159,5785585,5927210,6069000,6211021,6353304,6495814,6638449,6781292,6924353,7067636,7211106,7354711,7498504,7642514,7786669,7931004,8075504,8220199,8364997,8510049,8655190,8800484,8945974,9091590,9237328,9383292,9529316,9675504,9821898,9968324,10114972,10261748,10408621,10555635,10702823,10850034,10997454,11145096,11292653,11440411,11588376,11736313,11884447,12032740,12181098,12329547,12478206,12626845,12775675,12924562,13073587,13222720,13372007,13521286,13670825,13820360,13970034};

int k,cnt;

inline int Work(int x)
{
	int re = 1;
	for(int i = 2; i * i <= x; ++i) {
		if(x % i == 0) {
			int cnt = 0;
			while(x % i == 0)
				x /= i,++cnt;
			re *= (cnt + 1);
		}
	}
	if(x != 1)	re <<= 1;
	return re;
}

int main()
{
	cin >> k;
	int temp = k / 10000;
	cnt = ans[temp];
	for(int i = temp * 10000 + 1; i <= k; ++i)
		cnt += Work(i);
	cout << cnt << endl;
	return 0;
}

抱歉!评论已关闭.