UVA
来源:互联网 发布:北京网络职业学院搬迁 编辑:程序博客网 时间:2024/06/07 17:17
题意:
- 数列x[2*n]是按照
xi=(a⋅xi−1+b)%10001 生成的,现在给你n个奇数项x1,x3,x5⋅⋅⋅x2∗n−1 ,求偶数项,(一组可行解)
- 数列x[2*n]是按照
规模:
1<=n,xi<=10000 1<=a,b<=10000 1<=T<=100
类型:
- 数论,gcd
分析:
x2=ax1+b−mod∗y x3=ax2+b−mod∗y - 1式代入2式得:
x3−a2x1=(a+1)∗b+mod∗y - 枚举a,通过ex_gcd得b,判断是否满足
时间复杂度&&优化:
- 看上去像
n2 ,但实际ex_gcd这里只有(x3−a2x1)%gcd(a+1,mod)==0 时b有解,实际很少。
- 看上去像
代码:
#include<stdio.h>#include<string.h>#include<stdlib.h>#include<queue>#include<stack>#include<math.h>#include<vector>#include<algorithm>#include<iostream>using namespace std;const int INF=0x3fff3fff;const int MAXN=1010;const int MAXM=40010;const int MOD=10001;typedef long long ll;//****************//返回d=gcd(a,b);和对应于等式ax+by=d中的x,ylong long extend_gcd(long long a,long long b,long long &x,long long &y){ if(a==0&&b==0)return -1; if(b==0){x=1;y=0;return a;} long long d=extend_gcd(b,a%b,y,x); y-=a/b*x; return d;}int n,m;long long x[2100];int main(){ std::ios::sync_with_stdio(false); std::cin.tie(0); while(cin>>n){ n*=2; for(int i=1;i<=n;i+=2){ cin>>x[i]; } long long a,b,y; for(a=0;;a++){ long long c=x[3]-a*a*x[1]; long long d=extend_gcd(a+1,MOD,b,y); if(c%d)continue; b=b*c/d; //cout<<a<<endl; int flag=1; int i; for(i=2;i<=n;i++){ if(i&1){ if(x[i]!=(a*x[i-1]+b)%MOD){break;} } else x[i]=(a*x[i-1]+b)%MOD; // cout<<i<<" "<<x[i]<<endl; } if(i>n)break; } for(int i=2;i<=n;i+=2) printf("%lld\n",x[i]); } return 0;}
阅读全文
0 0