P1403 [AHOI2005]约数研究

这个题很有意思啊,

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int ans[1000003],n,maxn;
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		for(int j=1;j<=sqrt(i);j++){
			if(i%j==0)	ans[i]+=2;
			if(j==i/j&&i%j==0)	ans[i]--;
		}
	}
	for(int i=1;i<=n;i++)
		maxn+=ans[i];
	printf("%d",maxn);
	return 0;
}

 暴力打了一个稍稍加了个技巧得了60.

正解的话,暴力还有一种搞法,把每个数当因子把它的倍数加一。

由这个也可以推出一个式子,每个数在1到n的贡献为n/i个。

第一种

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int ans[1000003],n,maxn;
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        for(int j=i;j<=n;j+=i){
            ans[j]++;
        }
    }
    for(int i=1;i<=n;i++)
        maxn+=ans[i];
    printf("%d",maxn);    
    return 0;
}

第二种

#include<iostream>
using namespace std;
int n,ans;
int main(void){
    cin>>n;
    for(int i=1;i<=n;i++)ans+=n/i;
    cout<<ans;
}
原文地址:https://www.cnblogs.com/jindui/p/11639294.html