UVa:10162 Last Digit

这个题其实是找规律。0到9每次数字的x次方所得到的最后一位数字是有周期循环的,比如说1的周期就是1,2的可能得到2,4,8,6,2周期就是4,其他数字也是。周期一共有1,2,4这几种(大概是,记不清了)。设周期为r,再利用x^x这个条件,可发现每个数在周期内的变化量是10%r,也就是说每10个数它在周期内的位置就会变化10%r。这时候发现有一些数字的变化是同步的,也有不同步的,这样有两种情况,巧的是两种情况的和的个位数字都是7。这样只需要算一下所给的数里面有多少个10,最后判断是哪种情况即可。

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define MAXN 10000
#define MOD 1000000007
#define INF 2139062143
#define ll unsigned long long
using namespace std;
int sum1[12]= {0,1,5,2,8,3,9,2,8,7};
int sum2[12]= {0,1,7,0,6,1,7,4,8,7};
const int key=7;
int main()
{
    char str[MAXN];
    while(scanf("%s",str))
    {
        if(!strcmp(str,"0")) break;
        int L=strlen(str)-1;
        int ans=0,rem=0;
        for(int i=0; i<L; ++i)
        {
            ans=(ans*10+(str[i]-'0')*7)%10;
            rem=(rem*10+str[i]-'0')%4;
        }
        rem=(rem*10+1)%4+1;
        if(rem==2) ans+=sum1[str[L]-'0'];
        else if(rem==4) ans+=sum2[str[L]-'0'];
        printf("%d\n",ans%10);
    }
    return 0;
}


 

 

你可能感兴趣的:(数学)