UVA13216-Problem with a ridiculously long name【过长省略】 题解

· · 题解

水题

题目传送门

题目分析

很明显,这是一道找规律的题。

我们知道,如果 n 超过一定数量,66^n 会非常大。所以这道题我们采用字符串来做。

既然这是一个超大数,那么肯定有自己的规律,毕竟题目只需要输出结果最多后两位。

那么我们来打表找一找规律吧!

n 结果
0 1
1 66
2 4356
3 287496
4 18974736
5 1252332576
6 82653950016
7 5455160701056
8 360040606269696
9 23762680013799936
10 1568336880910795776

到这里,我们可以发现,除了 n0,1 的情况,其余结果的后两位都是按照 56,96,36,76,16 的规律循环的。

那么,我们可以用 n 去对循环周期 5 取余,然后输出相应答案即可。

于是我们通过取余发现:

  1. 余数为 2 时,答案倒数第二位是 5
  2. 余数为 3 时,答案倒数第二位是 9
  3. 余数为 4 时,答案倒数第二位是 3
  4. 余数为 0 时,答案倒数第二位是 7
  5. 余数为 1 时,答案倒数第二位是 1

当然答案的个位全是 6,因为 6 除了 0 次幂以外个位都是 666 也一样。

AC Code

#include<bits/stdc++.h>
using namespace std;
int t;
string n;     //用字符串
int main(){
    scanf("%d",&t);
    while(t--){
        cin>>n;
        if(n=="0"||n=="1"){     //注意0,1特判!
            if(n=="0")     //66^0=1
              puts("1");
            else     //66^1=66
              puts("66");
            continue;
        }
        int x=n[n.size()-1]-'0';     //取n的最后一位数并转换成数字
        //以下依次根据情况判断
        if(x%5==2)
          puts("56");
        if(x%5==3)
          puts("96");
        if(x%5==4)
          puts("36");
        if(x%5==0)
          puts("76");
        if(x%5==1)
          puts("16");
    }
    return 0;
}