0
点赞
收藏
分享

微信扫一扫

CF1673DLost Arithmetic Progression 题解

大柚子top 2022-05-01 阅读 57
c++算法

a,b公差的最小公倍数就是c的公差

判断0的情况比较多,但是都比较trival

1. 区间c未完全属于区间a

2.公差不能除尽

3.首项之差不能除尽a的公差,简而言之就是对不上

判断-1的情况我考场的想法是枚举之后再判断,但是这样比较复杂,考虑一个最长的枚举的长度,也就是a的公差,直接判断即可

剩下的考场上大概我有思路,但实在不太想打,答案就是枚举b这个公差是多少,因为枚举了b的公差之后可以保证以下性质,b的公差在sqrt的数量级,接下来只会有两边拓展开的那些部分,可以相乘再加上

贴个官方代码

        cin >> b >> q >> y;
        cin >> c >> r >> z;
        long long e = b+q*(y-1);
        long long f = c+r*(z-1);
        if(c<b || c>e || f<b || f>e || r%q!=0 || (c-b)%q!=0)
            cout << 0 << '\n';
        else if(c-r<b || f+r>e)
            cout << -1 << '\n';
        else
        {
            long long ans = 0;
            for(long long p=1;p*p<=r;p++)
            {
                if(r%p==0)
                {
                    if(lcm(p,q)==r)
                    {
                        long long a = ((r/p)*(r/p))%MOD;
                        ans = (ans+a)%MOD;
                    }
                    if(p*p!=r && lcm(r/p,q)==r)
                    {
                        long long a = (p*p)%MOD;
                        ans = (ans+a)%MOD;
                    }
                }
            }
举报

相关推荐

0 条评论