题目机翻
每次测试时限:2 秒
每次测试的内存限制:256 兆字节
输入:标准输入
输出:标准输出
金星以其有毒的大气和地狱般的温度而闻名,显然任何文明都无法在这里生存和发展。然而,最近在这颗行星上发现了数百万年前居住在金星上的古老文明("Venirics")的记录。
面对这一惊人的发现,太阳系行星联盟(USP)决定向这颗行星派遣唯一能够检索这些记录并揭示金星文明历史更多细节的专家:太空考古学家奥塔维奥。
在广泛的研究中,奥塔维奥发现了有关几代维尼人的惊人事实:
奥塔维奥找到的关于历史上维尼里克人种群数量的唯一完整记录是其总数量(即从第 0 代到第 m 代所有种群数量的总和),但他无法推断出 a 、 r 和 m 的值,因此向空间计算机科学家马塞洛寻求帮助。
马塞洛也无法从 n 中推导出 a 、 r 和 m 的值,因为他明智地注意到,这些参数的不同值可能会导致相同的 n 值。他唯一知道的是,给定 n 的世代大小的可能性并不多,他希望确定有多少种可能性。
然而,从金星的毒性中回来后,他就再也不能打字了,因此他要求你编写一个程序来回答他的问题。
输入
单个整数 n ( 1≤n≤109 ),即维尼里亚人的历史总人口。
输出
单个正整数 t ,即维尼里亚人世代大小的可能性数,这些世代会使维尼里亚人的历史总人口等于 n 。
1
输入
7
输出
3
2
输入
1000000000
输出
101
注
对于 n=7 ,世代大小的 3 可能性是
#include<iostream>
#include<map>
#include<cmath>
#define ll long long
using namespace std;
int main(){
ll n;
cin >> n;
ll ans = 0;
//求m = 1时的情况,即n除了1以外的因数个数
if(n >= 2){
for(int i = 2; i*i <= n ;++i){
if(i * i == n){
ans += 1;
continue;
}
if(n % i == 0)
{
ans += 2;
}
}
ans ++ ;
}
//枚举 r,m
if(n >= 7){
for(ll r = 2 ; r*r <= n ; ++r){
ll gcd = 1 + r ;
for(ll m = 2; m <= n ; ++m){
gcd = gcd * r + 1;
if(gcd > n)break;
if( gcd != 0 && n % gcd == 0) {
++ans;
}
}
}
}
// m = 0 时只有一种情况,答案加上1.
cout << ans + 1;
return 0;
}