1200: 8002 越多越好

题目描述

给定一个数字序列{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 
#include 
 
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

我的错误的代码

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

#include
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(xmin)
                    min=x;
                }
                else if(x

 

 

你可能感兴趣的:(算法零基础,算法)