洛谷 [P1403] 约数研究

本题的思想很好,正难则反

首先如果暴力枚举每个数的约数个数,一定会超时,那么我们就从约数的角度考虑,题目中问的是1n的约数个数和,那么我们就枚举约数,看每个约数在1n中出现过几次。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <cmath>
using namespace std;
int init(){
	int rv=0,fh=1;
	char c=getchar();
	while(c<'0'||c>'9'){
		if(c=='-') fh=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		rv=(rv<<1)+(rv<<3)+c-'0';
		c=getchar();
	}
	return rv*fh;
}
long long cnt;
int n;
int main(){
	//freopen("in.txt","r",stdin);
	n=init();
	for(int i=1;i<=n;i++){
		cnt+=n/i;
	}
	cout<<cnt;
	//fclose(stdin);
	return 0;
}
posted @ 2017-11-20 21:15  Mr_Wolfram  阅读(204)  评论(0编辑  收藏  举报