UVA12169Disgruntled Judge(扩展欧几里得)

题意:给一输入序列,给出递归公式,求输出序列
思路:
有递推公式可得x3 = (ax2+b) %mod = (a (ax1 +b)%mod + b ) %mod;

所以x3 = [ aax1 + (a+1)*b ] %mod;

即:b*(a+1) - kmod = x3 - aa*x1; (k是整数)
其中a,b是未知的,a的范围在[0,10000],可以枚举a,用exgcd求出b,然后对奇数项进行判断。

ll ans[20010], fin[20010];
int main()
{
	//freopen("in.txt", "r", stdin);
	int n;
	while (cin >> n)
	{
		f(i, 1, 2 * n)
		{
			scanf("%lld", &ans[i]);
			i++;
		}
		ll mod = 10001;
		f(a, 0, 10000)
		{
			ll tmp = ans[3] - a * a*ans[1];
			ll b, y, d;
			ex_gcd(a + 1, mod, b, y, d);
			if (tmp%d != 0)continue;
			b *= tmp / d;
			int fg = 1;
			fin[1] = ans[1];
			f(i, 2, n * 2)
			{
				fin[i] = (a*fin[i-1] + b) % mod;
				if (i & 1)
				{
					if (fin[i] != ans[i]) { fg = 0;break; }
				}
			}
			if (fg)break;
		}
		f(i, 2, 2 * n)
		{
			printf("%lld\n", fin[i]);
			i++;
		}
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值