Collatz问题

本文介绍了一种解决Collatz猜想问题的方法,通过迭代序列找出在特定范围内产生最长运算路径的起始数字,并提供了高效的算法实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Collatz问题

Time Limit: 250ms   Memory limit: 65536K  有疑问?点这里^_^

题目描述

一下迭代序列定义在整数集合上:

n = n/2 (n 是偶数)

n = n*3 + 1(n 是奇数)

应用以上规则,并且以数字13开始我们得到一下序列:

13,40,20,10,5,16,8,4,2,1

可以看出这个以13开始以1结束的序列一共经过了9次运算。虽然还没有被证明(Collatz问题),但是人们认为在这个规则下,以任何数字开始都会以结束。

 

以哪个不超过x的正整数开始,能得到运算次数最多的序列?

注意:一旦序列开始,也就是从第二项开始,项是可以超过x的。

输入

 

输了一个整数n,接下来n行,每行一个整数x (1 <=x<=1,000,000)

输出

 

对于每次询问,你需要计算出最多的运算次数是多少。为了节约输出时间,你只需要输出所有询问的答案之和 。

示例输入

3
1
2
3

示例输出

8

提示

 

因为测试数据过大,建议使用高效的读入,比如scanf()

如果你觉得scanf()仍然不够快,可以参考一下读入方式。

 

#include 

 

template 

inline void read(T& x) {

    char ch; while (!((((ch=getchar())>='0') && (ch <= '9')) || (ch == '-')));

    x = ch-'0'; while (((ch=getchar())>='0') && (ch <= '9')) x = x*10+ch-'0';

}

 

int main()

{

    int a,b;

    read(a);//等价于scanf(“%d”,&a);

    read(b);//等价于scanf(“%d”,&b);

}

来源

 

示例程序

 
#include <iostream>    
#include <algorithm>    
#include <cstdio>    
#include <cstring>    
#define LL long long    
using namespace std;    
LL dp[1000100],a[1000100];    
LL DFS(LL i)    
{    
    if(i==1)    
    {    
        return 0;    
    }    
    if(i<1000000)    
    {    
        if(a[i]) return a[i];    
    }    
    if((i%2)==1) return  DFS(i*3+1)+1;    
    if((i%2)==0) return DFS(i/2)+1;    
}    
int main()    
{    
    int i,n,x;    
    LL m=0;    
    for(i=1;i<=1000000;i++)    
    {    
        a[i]=DFS(i);    
        if(m<a[i])    
            m=a[i];    
        dp[i] = m;    
    }    
    scanf("%d",&n);    
    LL ans=0;    
    while(n--)    
    {    
        scanf("%d",&x);    
        ans += dp[x];    
    }    
    printf("%lld\n",ans);    
    return 0;    
}     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值