| ||||||||||
Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
直接乘法逆元啊,没别的了不过还是没1A,注意有a==b,c=0的情况 #include <cstdio> typedef long long ll; ll a, b, c, k, d, m; ll extEuc(ll m, ll k) { long long *u, *v, *t, a[3][3] = {1, 0, m, 0, 1, k}, q; u = (m > k) ? a[0] : a[1]; v = (m > k) ? a[1] : a[0]; t = a[2]; while(v[2] != 1) { q = u[2] / v[2]; t[0] = v[0], t[1] = v[1], t[2] = v[2]; v[0] = u[0]-q*v[0], v[1] = u[1]-q*v[1], v[2] = u[2]-q*v[2]; u[0] = t[0], u[1] = t[1], u[2] = t[2]; } while(v[1] < 0) v[1] += m; return v[1] % m; } int main() { while(scanf("%lld%lld%lld%lld", &a, &b, &c, &k) && k) { m = 1LL << k, d = (b - a + m) % m; if(!d && !c){ printf("0\n"); continue; } while(!(d&1) && !(c&1)) d >>= 1, c >>= 1, m >>=1; if(!(c&1)) { printf("FOREVER\n"); continue; } printf("%lld\n", extEuc(m, c) * d % m); } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator