読者です 読者をやめる 読者になる 読者になる

srupのメモ帳

競プロで解いた問題や勉強したことを記録していくメモ帳

yukicoder No.167 N^M mod 10

yukicoder 数学

問題

問題概要

nm mod10 を求める。 ただし制約が大きい。

解法

数として計算するころはできないよね。今回の問題はmod10を求める問題なので、nをm回かけた後の下一桁だけがわかればよい。下一桁がわかればよいということは、nの下一桁のみをm回かければよい。mの制約も大きいので規則性を見つける。
すると、下一桁が、
0,1,5,6の時はmod1で循環していて、 4,9の時はmod2で循環していて、 2,3,7,8の時はmod4で積が循環していることがわかる。 このことから、mのmod1,mod2,mod4の値がわかれば、nmの値が求まる。

ミス

なし。

コード

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef vector<int> vint;
typedef pair<int,int> pint;
typedef vector<pint> vpint;
#define rep(i,n) for(int i=0;i<(n);i++)
#define reps(i,f,n) for(int i=(f);i<(n);i++)
#define all(v) (v).begin(),(v).end()
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define chmax(a, b) a = (((a)<(b)) ? (b) : (a))
#define chmin(a, b) a = (((a)>(b)) ? (b) : (a))

int main(void){
    string n, m; cin >> n >> m;
    int num = n[n.size() - 1] - '0';
    if(m == "0"){
        printf("1\n");
        return 0;
    }

    int f = m[m.size() - 1] - '0';
    int ff;
    if(m.size() == 1){
        ff = m[m.size() - 1] - '0';
    }else{
        ff = (m[m.size() - 2] - '0') * 10 + (m[m.size() - 1] - '0');
    }

    if(num == 0 || num == 1 || num == 5 || num == 6){
        printf("%d\n", num);
    }else if(num == 4){
        if(f % 2 == 0) printf("6\n");
        else printf("4\n");
    }else if(num == 9){
        if(f % 2 == 0) printf("1\n");
        else printf("9\n");
    }else if(num == 2){
        if(ff % 4 == 1) printf("2\n");
        else if(ff % 4 == 2) printf("4\n");
        else if(ff % 4 == 3) printf("8\n");
        else if(ff % 4 == 0) printf("6\n");
    }else if(num == 3){
        if(ff % 4 == 1) printf("3\n");
        else if(ff % 4 == 2) printf("9\n");
        else if(ff % 4 == 3) printf("7\n");
        else if(ff % 4 == 0) printf("1\n");
    }else if(num == 7){
        if(ff % 4 == 1) printf("7\n");
        else if(ff % 4 == 2) printf("9\n");
        else if(ff % 4 == 3) printf("3\n");
        else if(ff % 4 == 0) printf("1\n");
    }else if(num == 8){
        if(ff % 4 == 1) printf("8\n");
        else if(ff % 4 == 2) printf("4\n");
        else if(ff % 4 == 3) printf("2\n");
        else if(ff % 4 == 0) printf("6\n");
    }
    return 0;
}