cf/Codeforces ECR16-D - Two Arithmetic Progressions-中国剩余定理

原创 2016年08月31日 10:03:41

Problem ECR16-D - Two Arithmetic Progressions-

题目大意

 给两个等差数列 You are given two arithmetic progressions: a1k + b1 and a2l + b2. Find the number of integers x such that L ≤ x ≤ R andx = a1k' + b1 = a2l' + b2, for some integers k', l' ≥ 0.  

给一个L,R,问L到R里有多少个x满足  x = a1k' + b1 = a2l' + b2,

   数据范围:a1,a2,b1,b2,L,R <= 10^18。

解题分析

   其实题目的式子可以转化为两个模仿方程,也就是 x=b1(mod a1 )  ,x=b2(mod a2 )

由于a1,a2并不互质,不能直接用中国剩余定理,我们需要通过把式子都合并起来,再使用中国剩余定理

  如果两个式子不能合并,那么就是找不到x,输出0,否则就找一个比L小的 正解cur,然后看看cur到L-1里有多少个解,cur到R里有多少个解。


由于题目的直线斜率是正的,因此 x的最小取值为max(b1,b2),L取max(L,max(b1,b2))

 


参考程序


 

#include <iostream>
#include <string.h>
#include <stdio.h>

using namespace std;
typedef long long ll;
const int N = 1005;

ll a[N], m[N];

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

void extend_Euclid(ll a, ll b, ll &x, ll &y)
{
    if(b == 0)
    {
        x = 1;
        y = 0;
        return;
    }
    extend_Euclid(b, a % b, x, y);
    ll tmp = x;
    x = y;
    y = tmp - (a / b) * y;
}

ll Inv(ll a, ll b)
{
    ll d = gcd(a, b);
    if(d != 1) return -1;
    ll x, y;
    extend_Euclid(a, b, x, y);
    return (x % b + b) % b;
}

bool merge(ll a1, ll m1, ll a2, ll m2, ll &a3, ll &m3)
{
    ll d = gcd(m1, m2);
    ll c = a2 - a1;
    if(c % d) return false;
    c = (c % m2 + m2) % m2;
    m1 /= d;
    m2 /= d;
    c /= d;
    c *= Inv(m1, m2);
    c %= m2;
    c *= m1 * d;
    c += a1;
    m3 = m1 * m2 * d;
    a3 = (c % m3 + m3) % m3;
    return true;
}
ll cur,mm;
ll CRT(ll a[], ll m[], int n)
{
    ll a1 = a[1];
    ll m1 = m[1];
    for(int i=2; i<=n; i++)
    {
        ll a2 = a[i];
        ll m2 = m[i];
        ll m3, a3;
        if(!merge(a1, m1, a2, m2, a3, m3))
            return -1;
        a1 = a3;
        m1 = m3;
    }
    cur=a1,mm=m1;
    return (a1 % m1 + m1) % m1;
}

int main()
{
    int n=2;
    ll L,R;
    for(int i=1; i<=n; i++)
        scanf("%lld%lld",&m[i], &a[i]);
    scanf("%lld%lld",&L,&R);
    ll ans = CRT(a, m, n);
    if (ans==-1)
    {
        printf("0\n");
        return 0;
    }
    L=max(L,max(a[1],a[2]));        //***
    //cal ans between [L-1,R]
    ans=0;
    if (cur>=L) cur-=((cur-L)/mm+1)*mm;  //find a cur that < L
    if (L<=R)
        ans= (R-cur)/mm-(L-1-cur)/mm;

    printf("%lld\n",ans);

    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

CodeForces 710D Two Arithmetic Progressions

题目链接:http://codeforces.com/problemset/problem/710/D 题意:给两条直线,a1 * x + b1 和 a2 * x + b2,问存在多少Y∈[...
  • chy20142109
  • chy20142109
  • 2016年09月04日 21:50
  • 276

codeforces 710D Two Arithmetic Progressions (扩展中国剩余定理)

You are given two arithmetic progressions: a1k + b1 and a2l + b2. Find the number of integers x su...
  • wust_zzwh
  • wust_zzwh
  • 2016年08月23日 09:13
  • 725

CodeForces 710D Two Arithmetic Progressions(模线性方程组)

对于给定的两个一元二次方程,问使得L=0的解一共有几个 比较容易看出来对于任意一个解X, X==b1(mod a1),X==b2(mod a2) 那么使用扩展欧几里得得到m0 a0 使得 任意k...
  • pootree
  • pootree
  • 2016年08月27日 18:00
  • 226

Codeforces Problem 710D Two Arithmetic Progressions(中国剩余定理)

Codeforces Problem 710D Two Arithmetic Progressions(中国剩余定理)
  • queuelovestack
  • queuelovestack
  • 2016年08月24日 11:22
  • 946

Codeforces 382C Arithmetic Progression(排序+分类)

题目链接:Codeforces 382C Arithmetic Progression 题目大意:给出一个长度为n的序列,表示有n张卡片,上面的数字,现在还有一张卡片,上面没有数字,问说可以...
  • u011328934
  • u011328934
  • 2014年02月02日 18:32
  • 1376

codeforces 710D Two Arithmetic Progressions [同余方程]【数论】

题目链接:http://codeforces.com/problemset/problem/710/D ————————–. D. Two Arithmetic Progressions tim...
  • qq_33184171
  • qq_33184171
  • 2016年08月24日 17:32
  • 458

codeforces 338D GCD Table (扩展中国剩余定理)

D. GCD Table time limit per test 1 second memory limit per test 256 megabytes input...
  • clover_hxy
  • clover_hxy
  • 2017年02月19日 08:48
  • 392

[Codeforces710D]Two Arithmetic Progressions(扩展中国剩余定理)

题目描述传送门题解x=a1k+b1,y=a2l+b2x=a_1k+b_1,y=a_2l+b_2 也就是说 x≡b1(moda1)x\equiv b_1\pmod {a_1} x≡b2(moda2...
  • Clove_unique
  • Clove_unique
  • 2017年03月03日 16:01
  • 285

扩展欧几里得算法,中国剩余定理(Two Arithmetic Progressions,cf 710D)

理论知识 http://blog.csdn.net/xiaofengsheng/article/details/4813170 参考代码 http://blog.csdn.net/miracle_...
  • xl2015190026
  • xl2015190026
  • 2016年08月24日 16:20
  • 260

Codeforces 811B Vladik and Complicated Book

A掉的第二题。。。 B. Vladik and Complicated Book time limit per test 2 seconds memory li...
  • szh_0808
  • szh_0808
  • 2017年05月28日 16:30
  • 540
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:cf/Codeforces ECR16-D - Two Arithmetic Progressions-中国剩余定理
举报原因:
原因补充:

(最多只允许输入30个字)