Eddy's digital Roots(九余数定理)

原题地址
今天心情不太好,随便找了一道水题做做,然后就开始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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值