码迷,mamicode.com
首页 > 其他好文 > 详细

扩欧几里得+暴力

时间:2018-11-16 20:49:32      阅读:123      评论:0      收藏:0      [点我收藏+]

标签:a*   偶数   max   https   一个   break   cout   ++   algo   

给出一个数列:x2=(a*x1+b)%10001;的奇数项,求出偶数项。

题目:UVA 12169

分析:

x2 = (a * x1 + b) % 10001;

x3 = (a * x2 + b) % 10001;

联立2个式子

x3 = (a * (a * x1 + b) % 10001 + b ) % 10001;

x3 = (a * (a * x1 + b) + b) % 10001;

所以 x3 + 10001 * k = a * a * x1 + (a + 1) * b;

x3 - a * a * x1 = (a + 1) * b + 10001 * (-k);

枚举a,即拓欧几里得就可以求出 b。然后就可以求出整个数列,匹配是否正确即可。

代码:

#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
const int max_=105*2;
typedef unsigned long long ll;
ll f[max_];
ll g,k,B;
void gcd_(ll a,ll b,ll &d,ll &x,ll &y)
{
    if(!b)
    {
        d=a;
        x=1;
        y=0;
    }
    else
    {
        gcd_(b,a%b,d,y,x);
        y-=x*(a/b);
    }
}
int main()
{
    int t;
    cin>>t;
    for(int i=1;i<2*t;i+=2)
    {
        cin>>f[i];
    }
    //ll c=f[1]
    for(int a=0;a<10001;a++)
    {
        bool falg=0;
        ll c=f[3]-(a*a*f[1]);
        gcd_(a+1,10001,g,B,k);
        if(c%g)
            continue;
        else
            B=B*(c/g);
        for(int i=2;i<=2*t;i++)
        {
            ll temp=(a*f[i-1]+B)%10001;
            if(i%2)
            {
                if(temp!=f[i]){
                    falg=1;break;
                }
            }
            else
                f[i]=temp;
        }
        if(!falg)
            break;
    }
    for(int i=2;i<=2*t;i+=2)
        cout<<f[i]<<endl;
}

 

扩欧几里得+暴力

标签:a*   偶数   max   https   一个   break   cout   ++   algo   

原文地址:https://www.cnblogs.com/linhaitai/p/9971091.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!