UVA 12169

思路: x3=(a(a*x1+b)%10001)+b)%10001

a*b+b+y*10001=x3-a*a*x1

对应a*x+b*y=c;

a=(a+1),b=10001,c=x3-a*a*x1。

枚举a的值,扩欧解不定方程解出x。

判断该x是否满足整个序列。

注意:该题要用long long,不然会运行不出结果。。

#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define ll long long
#define fo freopen("in.txt","r",stdin)
#define fc fclose(stdin)
#define fu0(i,n) for(i=0;i<n;i++)
#define fu1(i,n) for(i=1;i<=n;i++)
#define fd0(i,n) for(i=n-1;i>=0;i--)
#define fd1(i,n) for(i=n;i>0;i--)
#define mst(a,b) memset(a,b,sizeof(a))
#define sd(n) scanf("%d",&n)
#define sdd(n,m) scanf("%d %d",&n,&m)
#define ss(s) scanf("%s",s)
#define sddd(n,m,k) scanf("%d %d %d",&n,&m,&k)
#define pans() prllf("%d\n",ans)
#define all(a) a.begin(),a.end()
#define sc(c) scanf("%c",&c)
#define we(a) while(scanf("%d",&a)!=EOF)
const ll maxn=200005;
const double eps=1e-8;
void kgcd(ll a,ll b,ll &d,ll &x,ll &y)//ax+by=gcd(a,b),d是gcd(a,b)
{
    if(!b)
    {d=a;x=1;y=0;}
    else
    {kgcd(b,a%b,d,y,x);y-=x*(a/b);}
}
int  main()
{
    ll n;
    cin>>n;
    ll f[10005];
    memset(f,0,sizeof(f));
    for(int i=1;i<=2*n;i+=2)
    {
        cin>>f[i];
    }
    ll a,x,y,m,b,d,c;
    for( a=0;;a++)
    {
        c=f[3]-a*a*f[1];
        b=10001;
        m=a+1;
        kgcd(m,b,d,x,y);
        if(c%d)
            continue;
        x=x*(c/d);
        y=y*(c/d);
        ll i;
        ll flag=0;
        for( i=2;i<=2*n;i++)
        {
            flag=0;
            ll t=(a*f[i-1]+x)%10001;
            if(i%2)
            {
                if(t!=f[i])
                {
                    flag=1;
                    break;
                }

            }
            else
                {
                    f[i]=t;
                }
        }
        if(!flag)
        {
            break;
        }
    }

    for(ll i=2;i<=2*n;i+=2)
    {
        cout<<f[i]<<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/dilly__dally/article/details/80709500