栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【每日一题】P1403 [AHOI2005]约数研究

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【每日一题】P1403 [AHOI2005]约数研究

文章目录
  • 前言
  • 解题思路
    • f ( i ) = n / i f(i)=n/i f(i)=n/i
    • 以n=12为例,约数表如下:
  • AC代码
  • 总结


前言

坚持每天做一道算法题,每天学一点数据结构与算法,写思路和题解来加深自己的印象。


P1403 [AHOI2005]约数研究


解题思路

找规律:在1~n中含有“2”这个因子的数有n/2个,3有n/3个,以此类推,公式就出来了。

f ( i ) = n / i f(i)=n/i f(i)=n/i 以n=12为例,约数表如下:
123456789101112
1111111111111
2222222
33333
4444
555
666
77
88
99
1010
1111
1212
122324243426
SUM13581014162023272935

AC代码
#include 
using namespace std;

int n;
long long int res;

void solve(int n) {
	for(int i = 1; i <= n; i++)	res += n / i;
}

int main (void) {
	scanf("%d", &n);
	solve(n);
	printf("%lld", res);
	return 0;
}

总结

感觉自己有些投机取巧解了这道题,但是看了大佬们的题解算是彻底理解了这道题。
这道题可以暴力,但貌似不能纯暴力,要用筛法。代码如下:

#include 
using namespace std;

int n;
int a[10000001];
long long int res;

void solve(int n) {
	for (int i = 1; i <= n; i++) {
		for (int j = i; j <= n; j += i) a[j]++; // i翻倍,其倍数j一定含有因子i
		res += a[i];
	}
}

int main (void) {
	scanf("%d", &n);
	solve(n);
	printf("%lld", res);
	return 0;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/867393.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号