Project Euler 179

Project Euler 179

题目

Consecutive positive divisors

Find the number of integers \(1 < n < 10^7\), for which \(n\) and \(n + 1\) have the same number of positive divisors. For example, \(14\) has the positive divisors \(1, 2, 7, 14\) while \(15\) has \(1, 3, 5, 15\).

解决方案

线性筛可以用于高速计算积性函数的值,本题需要求的积性函数是因数个数。

\(v[i]\)\(i\)最小的质因数。如果用比\(v[i]\)更小的质因数\(p\)产生了一个新数,那么\(i\)中的所有因数都需要乘以一个\(p\),与原来的因数一起成为新数的因子,因此多添加了一倍的因子。

如果\(p=v[i]\),那么按照上面的说法,产生出来的因数是有重复的。假设\(i\)分解质因数后质因数\(p\)的次数为\(e\),那么\(p,p^2,\dots,p^e\)都是重复的一部分,而这一部分因数的数量恰好和\(\dfrac{i}{p}\)因数数量相等,因此需要减去这一部分。

计算完因数个数函数后,直接进行判断。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <bits/stdc++.h>
using namespace std;
const int N=1e7;
int pr[N/4+40],v[N+1],s[N+1],m=0;
int main(){
s[1]=1;
for(int i=2;i<=N;i++){
if(v[i]==0){
v[i]=i;s[i]=2;
pr[++m]=i;
}
for(int j=1;j<=m;j++){
if(pr[j]>v[i]||pr[j]>N/i) break;
v[i*pr[j]]=pr[j];
if(pr[j]==v[i])
s[i*pr[j]]=s[i]+s[i]-s[i/pr[j]];
else
s[i*pr[j]]=s[i]+s[i];
}
}
int ans=0;
for(int i=1;i<N;i++)
if(s[i]==s[i+1]) ++ans;
printf("%d\n",ans);
}
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
Ujimatsu Chiya 微信 微信
Ujimatsu Chiya 支付宝 支付宝