2011-06-14 20:53:49Morris

b238. A. 腹黑、傲嬌

http://zerojudge.tw/ShowProblem?problemid=b238

內容 :

輸入說明 :

輸出說明 :

如果腹黑,就輸出Haraguroi;若傲嬌,輸出Tsundere,否則輸出Normal

 

範例輸入 :

4
1 2
3 4
0 9

1 2
3 4
1 9

4 3
2 1
1 1

4 3
2 1
1 10000

範例輸出 :

Normal
Haraguroi
Normal
Tsundere

提示 :

出處 :

2009 NPSC 高中組初賽



作法 : 矩陣乘法 & D&C
當初不會矩陣,簡直被壓著打,過了那麼久才來討回 ...

/**********************************************************************************/
/*  Problem: b238 "A. 腹黑、傲嬌" from 2009 NPSC 高中組初賽             */
/*  Language: C                                                                   */
/*  Result: AC (4ms, 238KB) on ZeroJudge                                          */
/*  Author: morris1028 at 2011-06-12 08:18:47                                     */
/**********************************************************************************/


#include<stdio.h>
typedef struct {
    long long t[2][2];
}Matrix;
Matrix A, In, init;
Matrix mult(Matrix x, Matrix  y, int M) {
    Matrix t = init;
    int i, j, k;
    for(i = 0; i < 2; i++)
        for(j = 0; j < 2; j++)
            for(k = 0; k < 2; k++) {
                t.t[i][k] = (t.t[i][k] + (x.t[i][j]*y.t[j][k])%M)%M;
            }
    for(i = 0; i < 2; i++)
        for(j = 0; j < 2; j++)
            t.t[i][j] = (t.t[i][j]+M)%M;
    return t;
}
void ans(int t, int M) {
    Matrix y = A;
    long long H = 1, T = 1, tH, tT;
    while(t) {
        if(t&1) {
            tH = H, tT = T;
            T = ((y.t[0][0]*tT)%M + (y.t[0][1]*tH)%M)%M;
            H = ((y.t[1][0]*tT)%M + (y.t[1][1]*tH)%M)%M;
            H = (H+M)%M, T = (T+M)%M;
        }
        y = mult(y, y, M);
        t /= 2;
    }
    if(H == T)
        puts("Normal");
    else if(H < T)
        puts("Tsundere");
    else
        puts("Haraguroi");
}
main() {
    int T, a, b, t, M;
    for(a = 0; a < 2; a++)
        for(b = 0; b < 2; b++)
            A.t[a][b] = 0, In.t[a][b] = 0,
            init.t[a][b] = 0;
    for(a = 0; a < 2; a++) In.t[a][a] = 1;
    scanf("%d", &T);
    while(T--) {    
        scanf("%lld %lld %lld %lld", &A.t[0][0], &A.t[0][1], &A.t[1][0], &A.t[1][1]);
        scanf("%d %d", &t, &M);
        ans(t, M);
    }
    return 0;
}