NKOJ1236 a^b
题目描述
对于任意两个正整数a,b(0<=a,b<10000)计算a^b各位数字的和的各位数字的和的各位数字的和的各位数字的和。
Input
输入有多组数据,每组只有一行,包含两个正整数a,b。最后一组a=0,b=0表示输入结束,不需要处理。
Output
对于每组输入数据,输出ab各位数字的和的各位数字的和的各位数字的和的各位数字的和。
Sample Input
2 3
5 7
0 0
Sample Output
8
5
数论定理
任何数除以9的余数等于各位数的和除以9的余数
证明:
n = A1A2A3...An = A1 * (10)^(n-1) + A2 * (10)^(n-2) + ... + An
= A1 *(999..99 + 1) + A2 * (999..9 + 1) +...+ An * (0 + 1)
=【A1 * (999..99) + ... + An-1 * (9)】+ (A1 + A2 +.....+An)
= x + y
x显然可以被9整出,因此 n % 9 == y % 9
#include <iostream> #include <cstdio> using namespace std; int QuickPow(int a, int n){ int ans = 1; while(n){ if(n&1) ans = (ans * a) % 9; n >>= 1; a *= a; } return ans; } int main(){ int a,n; while(cin>>a>>n){ if(a==0&&n==0) break; int ans = QuickPow(a,n); if(ans) cout<<ans<<endl; else cout<<"9"<<endl; } return 0; }