Lost Arithmetic Progression

Lost Arithmetic Progression

题意:

给出两个等差数列b和c,c是另一个等差数列a和b的公共部分。给出b,c的首相,公差和项数。
求满足条件的a数列的方案数。如果有无限个a满足条件,输出-1,如果没有,输出0。

思路:

设b数列的首项,公差,项数为a1,d1,n1,c数列为a2,d2,n2.

先考虑输出0的情况:

d2 % d1 != 0 || a2 < a1 || (a2 - a1) % d1 != 0 || a2 + (n2 - 1) * d2 > a1 + (n1 - 1) * d1

再考虑输出-1的情况:

如果a1大于a2-d2的话,那么a数列就可以向左边无限延申,如果a1 + (n1 - 1) * d1小于a2 + (n2 - 1) * d2 + d2的话,a就可以往右边无限延申。
a1 > a2 - d2 || a1 + (n1 - 1) * d1 < a2 + (n2 - 1) * d2 + d2

最后考虑一般情况:

因为c是a和b的公共部分,设a的首项,公差,项数为a3,d3,n3,则lcm(d1,d3)== d2。
我们可以枚举a数列的公差d3,对于每一个d3,a数列可以向左右分别延申d2/d3个元素,所以方案数为(d2/d3)*(d2/d3)。

代码:

/*************************************************************************
  > File Name: c.cpp
  > Author: Beans
  > Mail: 3112748286@qq.com 
  > Created Time: 2023/5/12 17:14:15
 ************************************************************************/

#include <iostream>
#include <algorithm>
#define int long long
#define endl '\n'

using namespace std;

const int maxn = 3e5 + 7;
const int mod = 1e9 + 7;

int t, a1, d1, n1, a2, d2, n2;

int gcd(int a, int b){

    return b ? gcd(b, a % b) : a;
}

int lcm(int a, int b){

    return a / gcd(a, b) * b % mod;
}

void solve(){

    cin >> a1 >> d1 >> n1 >> a2 >> d2 >> n2;
    if(d2 % d1 != 0 || a2 < a1 || (a2 - a1) % d1 != 0 || a2 + (n2 - 1) * d2 > a1 + (n1 - 1) * d1){

        cout << 0 << endl;
        return;
    }
    if(a1 > a2 - d2 || a1 + (n1 - 1) * d1 < a2 + (n2 - 1) * d2 + d2){

        cout << -1 << endl;
        return;
    }
    int ans = 0;
    for(int i = 1; i * i <= d2; i ++ ){

        if(d2 % i == 0){

            if(lcm(i, d1) == d2){

                ans = (ans + d2 / i * d2 / i) % mod;
            }
            int y = d2 / i;
            if(i * i != d2){

                if(lcm(y, d1) == d2){

                    ans = (ans + d2 / y * d2 / y) % mod;
                }
            }
        }
    }
    cout << ans << endl;
}

signed main(){

    ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
    cin >> t;
    while(t -- )
        solve();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

方哲Beans

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值