原题地址
今天心情不太好,随便找了一道水题做做,然后就开始WA。。。(更加难受)。想了半天也没觉得哪错,上网找个题解,发现是一个自己没接触到的数论中的九余数(无奈)
题意:找一个数的数根
自己的思路:直接上手暴力找时间复杂度是o(n^2),一开是觉得会超时,但后来看到数据范围,知道是数据范围太大了,于是,开始想用快速幂来降数据范围,但是还是降不下去。网上题解说九余数,用了一下,发现这题就是个板子题(哭了)。
*九余数:一个数对9取余等于这个数各位数相加的和对9取余,例如 123 %9 = (1+2+3)%9,所以题目中要求把一个数的各个位加起来直到是个不大于9的数,就等于直接对这个数对9取余。比如 789 7+8+9=24 2+4=6 789%9=6 , 另外公式 比如4的4次方最后对9取余 等于 { [(44)%9]4%9}4%9 。(大佬的讲解)
AC代码附上:
#include <iostream>
#include <algorithm>
#include <string.h>
#include <math.h>
using namespace std;
#define ll long long
ll mod = 1e12;
ll qpow(ll a, ll n) {
ll r = 1;
for (a %= mod; n; n >>= 1, (a *= a) %= mod)
if (n & 1) (r *= a) %= mod;
return r;
}
int main(){
ll n;
while(cin >>n){
if(n==0)
break;
ll sum = n;
for(int i=2;i<=n;i++){
sum = sum*n%9;
}
if(sum==0)
cout<<9<<endl;
else
cout<<sum,printf("\n");
}
return 0;
}