Rightmost Digit(简单数论_幂取模)

来源:互联网 发布:淘宝土楼万应膏怎么样 编辑:程序博客网 时间:2024/06/18 05:44

Rightmost DigitCrawling in process...Crawling failedTime Limit:1000MS    Memory Limit:32768KB    64bit IO Format:%I64d & %I64u

SubmitStatus

Description

Given a positive integer N, you should output the most right digit of N^N.
 

Input

The input contains several test cases. The first line of the input is a single integer T which is the number of test cases. T test cases follow.
Each test case contains a single positive integer N(1<=N<=1,000,000,000).
 

Output

For each test case, you should output the rightmost digit of N^N.
 

Sample Input

234
 

Sample Output

76

Hint

In the first case, 3 * 3 * 3 = 27, so the rightmost digit is 7.In the second case, 4 * 4 * 4 * 4 = 256, so the rightmost digit is 6.
题意:就是求n*n的个位数
思路:这是典型的幂取模的应用;
对于a^n%m来说  一般的做法是
int pow(int a,int n,int m)
{
    int ans=1;
    for(int i=0;i<n;i++)
    ans=(int)((long long)ans*n%m);
}
时间复杂度为O(n),当n很大的时候速度就很不理想。下面这种算法就能很大的提高速度:
利用分治法
int pow_mod(int a,int n,int m){    int x=pow_mod(a,n/2,m);    long long ans=(long long)x*x%m;    if(n%2==1)        ans=ans*a%m;    return (int)ans;}例如a^29=(a^14)^2*a----->a^14=(a^7)^2----->a^7=(a^3)^2*a----->a^3=a^2*a;一共只做了七次乘法,近似二分查找,每次规模减少近一半,时间复杂度为O(log n);
#include <stdio.h>#include <string.h>#include <stdlib.h>#include <map>#include <string>#include <algorithm>#include <iostream>#include <queue>using namespace std;int pow_mod(int a,int n,int m){    int ans= 1;    while (n > 0)    {        if (n%2==1)        {            ans=ans*a%m;        }        a*=a;        a%=m;        n/=2;    }    return ans;}int main(){    int T;    int n,t;    scanf("%d", &T);    while(T--)    {        scanf("%d", &n);        t=pow_mod(n%10,n,10);        printf("%d\n", t);    }    return 0;}



 

0 0