cf 450b 矩陣快速冪(數論取模 一大坑點啊)
阿新 • • 發佈:2017-11-11
sent double res nta note follow efi ted containe
Jzzhu has invented a kind of sequences, they meet the following property:
You are given x and y, please calculate fn modulo 1000000007 (109?+?7).
InputThe first line contains two integers x and y (|x|,?|y|?≤?109). The second line contains a single integer n (1?≤?n?≤?2·109).
OutputOutput a single integer representing f n modulo 1000000007 (109?+?7).
2 3Output
3
1Input
0 -1Output
2
1000000006Note
In the first sample, f2?=?f1?+?f3, 3?=?2?+?f3, f3?=?1.
In the second sample, f2?=??-?1; ?-?1 modulo (109?+?7) equals (109?+?6).
題意 : 顯然是矩陣快速冪麽
坑點 : 就是數論取模這一塊 , 稍不註意就錯了
const ll mod = 1e9+7; const double pi = acos(-1.0); const int inf = 0x3f3f3f3f; #define Max(a,b) a>b?a:b #define Min(a,b) a>b?b:a struct mat { ll a[2][2]; }; mat mul(mat a, mat b){ mat r; memset(r.a, 0, sizeof(r.a)); for(int i = 0; i < 2; i++){ for(int k = 0; k < 2; k++){ if (a.a[i][k]){ for(int j = 0; j < 2; j++){ if (b.a[k][j]){ r.a[i][j] += (a.a[i][k] * b.a[k][j] + mod)%mod; r.a[i][j] = (r.a[i][j] + mod)%mod; } } } } } return r; } mat pow(mat a, int n){ mat b; for(int i = 0; i < 2; i++) for(int j = 0; j < 2; j++) if (i == j) b.a[i][i] = 1; else b.a[i][j] = 0; while(n){ if (n & 1) b = mul(a, b); a = mul(a, a); n >>= 1; } return b; } int main() { ll x, y, n; scanf("%lld%lld%lld", &x, &y, &n); mat a; a.a[0][0] = a.a[1][0] = 1; a.a[0][1] = -1; a.a[1][1] = 0; if (n == 1){ printf("%lld\n", (x+mod)%mod); } else if (n == 2){ printf("%lld\n", (y+mod)%mod); } else { a = pow(a, n-2); ll ans = ((a.a[0][0]*y+mod)%mod + (a.a[0][1]*x+mod)%mod + mod)%mod; // 重點就是這裏 //ll ans = (a.a[0][0]*y+a.a[0][1]*x+mod)%mod; //ans = (ans + mod)%mod; printf("%lld\n", ans ); } return 0; } /* -9 -11 12345 */
cf 450b 矩陣快速冪(數論取模 一大坑點啊)