1200: 8002 越多越好

该问题是一个关于算法的编程挑战,要求找到一个最大的子序列,使得序列中的任意一对数之和小于给定的界限L,且每个数都小于L。解决方案涉及到计算序列并确定边界条件,特别是考虑L的一半情况。代码错误在于使用了int类型可能导致溢出,应使用longlong确保大整数的正确处理。

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

题目描述

给定一个数字序列{X1, X2, ... , Xn}, 假定 Xk = (A * k + B) % mod。你的任务就是找一个最大的子序列{Y1, Y2, ... , Ym} ,对于每对 (Yi, Yj)要求满足Yi + Yj <= L (1 ≤ i < j ≤ m), 而且同时满足Yi <= L (1 ≤ i ≤ m )。
现在给定n,L,A,B和mod,你的任务就是找出上述最大的m值。

输入

输入包括多组测试数据,直到文件尾。每个测试数据占一行,包括5个整数: n, L, A, B 和mod. (1 ≤ n ≤ 2 * 107, 1 ≤ L ≤ 2 * 109, 1 ≤ A, B, mod ≤ 109)

输出

对于每组测试数据,输出m值,占一行。

样例输入 复制

1 8 2 3 6
5 8 2 3 6

样例输出 复制

1
4

正确代码

这道题的思路的话

个人的理解 首先要注意的是longlong的使用

然后是循环注意一定是从1开始的

x的序列我们都可以求出来 那是否符合y的要求

从哪几方面来判断呢?

首先我们要确定两个边界 最大最小(其实可以是左边界和右边界)。

要考虑到 l/2的情况/

#include <stdio.h>
#include <string.h>
 
int main()
{
    long long n,l,a,b,mod;
    while(scanf("%lld %lld %lld %lld %lld",&n,&l,&a,&b,&mod)!=EOF){
    	long long i,x,max=l,min=0,m=0;
    	for(i=1;i<=n;i++){
    		x=(a*i+b)%mod;
    		if(x<=l/2){
    			m++;
    			if(x>min) min=x;
			}
			else if(x<max) max=x;
		}
		if(min+max<=l) m++;
		printf("%lld\n",m);
	}
    return 0;
}

我的错误的代码

错的地方是x<=l/2;

#include<stdio.h>
int main()
{
    long long n,l,a,b,mod;
    while(scanf("%lld %lld %lld %lld %lld",&n,&l,&a,&b,&mod)!=EOF)
    {
        int m=0;
        int x;
        int max=l,min=0;
        for(int i=1;i<=n;i++)
        {
            x=(a*i+b)%mod;
                if(x<l/2)
                {
                    m++;
                    if(x>min)
                    min=x;
                }
                else if(x<max)
                max=x;
                
        }
        if(max+min<=l)
                m++;
        printf("%lld\n",m);
    }
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值