CF题目求问,球球,没有过样例1e9,输出102
  • 板块学术版
  • 楼主flowercode
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/7/29 14:27
  • 上次更新2024/7/29 15:32:17
查看原帖
CF题目求问,球球,没有过样例1e9,输出102
1236674
flowercode楼主2024/7/29 14:27

原题

题目机翻

G. 外侨家谱

每次测试时限:2 秒

每次测试的内存限制:256 兆字节

输入:标准输入

输出:标准输出

金星以其有毒的大气和地狱般的温度而闻名,显然任何文明都无法在这里生存和发展。然而,最近在这颗行星上发现了数百万年前居住在金星上的古老文明("Venirics")的记录。

面对这一惊人的发现,太阳系行星联盟(USP)决定向这颗行星派遣唯一能够检索这些记录并揭示金星文明历史更多细节的专家:太空考古学家奥塔维奥。

在广泛的研究中,奥塔维奥发现了有关几代维尼人的惊人事实:

  • 第 00 代维尼伦人正好由 a≥1a \geq 1 个居民组成。
  • 在有繁殖能力的维尼里克星人的生命周期中,他们通过无性繁殖产生了 r>1r > 1 个后代。 rr 的值对于任何一代每一个维尼瑞人都是一样的。也就是说,如果第00代的所有aa个Venirics人都能繁殖,那么第 11 代Venirics人就是由 arar 组成的,第二代为 ar2ar^2...以此类推。
  • 由于一种至今仍未解释的遗传原因,某一代 m≥0m \geq 0 的所有个体都无法繁衍后代,但直到上一代的所有个体都能繁衍后代。因此,在 mm 代的个体死亡后,维尼瑞人的文明就结束了。

奥塔维奥找到的关于历史上维尼里克人种群数量的唯一完整记录是其总数量(即从第 00 代到第 mm 代所有种群数量的总和),但他无法推断出 aa 、 rr 和 mm 的值,因此向空间计算机科学家马塞洛寻求帮助。

马塞洛也无法从 nn 中推导出 aa 、 rr 和 mm 的值,因为他明智地注意到,这些参数的不同值可能会导致相同的 nn 值。他唯一知道的是,给定 nn 的世代大小的可能性并不多,他希望确定有多少种可能性。

然而,从金星的毒性中回来后,他就再也不能打字了,因此他要求你编写一个程序来回答他的问题。

输入

单个整数 nn ( 1≤n≤1091 \leq n \leq 10^9 ),即维尼里亚人的历史总人口。

输出

单个正整数 tt ,即维尼里亚人世代大小的可能性数,这些世代会使维尼里亚人的历史总人口等于 nn 。

样例

1

输入
7
输出
3

2

输入
1000000000
输出
101

注

对于 n=7n=7 ,世代大小的 33 可能性是

  • 第 00 代有 77 个没有繁殖的居民。
  • 第 00 代有 11 个居民繁衍了后代( r=6r=6 ),第 11 代有 66 个居民没有繁衍后代。
  • 第 00 代有 11 个居民繁衍了 22 个后代( r=2r=2 )。第 11 代,有 22 个居民繁衍后代,每个居民有 22 个后代。第 22 代,有 44 个居民没有繁衍后代。
#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;
}
2024/7/29 14:27
加载中...