1. 程式人生 > >nyoj52 正整數次冪的後K位

nyoj52 正整數次冪的後K位

無聊的小明

時間限制:3000 ms  |  記憶體限制:65535 KB難度:3
描述
      這天小明十分無聊,沒有事做,但不甘於無聊的小明聰明的想到一個解決無聊的辦法,因為他突然對數的正整數次冪產生了興趣。
  眾所周知,2的正整數次冪最後一位數總是不斷的在重複2,4,8,6,2,4,8,6……我們說2的正整數次冪最後一位的迴圈長度是4(實際上4的倍數都可以說是迴圈長度,但我們只考慮最小的迴圈長度)。類似的,其餘的數字的正整數次冪最後一位數也有類似的迴圈現象。
  這時小明的問題就出來了:是不是隻有最後一位才有這樣的迴圈呢?對於一個整數n的正整數次冪來說,它的後k位是否會發生迴圈?如果迴圈的話,迴圈長度是多少呢?
注意:
  1.如果n的某個正整數次冪的位數不足k,那麼不足的高位看做是0。
  2.如果迴圈長度是L,那麼說明對於任意的正整數a,n的a次冪和a + L次冪的最後k位都相同。
輸入
第一行輸入一個整數N(0<n<10);接下來每組測試資料輸入只有一行,包含兩個整數n(1 <= n <100000)和k(1 <= k <= 5),n和k之間用一個空格隔開,表示要求n的正整數次冪的最後k位的迴圈長度。
輸出
每組測試資料輸出包括一行,這一行只包含一個整數,表示迴圈長度。如果迴圈不存在,輸出-1。

樣例輸入
1
32 2
樣例輸出
4
//解題思路:同餘定理,暴力尋找計數,範圍小於等於 10^k,首次找到與  n % 10^k 相等即為迴圈,輸出計數,否則-1
#include <stdio.h>  
int main()  
{  
    int a[6]={0,10,100,1000,10000,100000};  
    int num,n,k;  
    long long y,record;  
    scanf("%d",&num);  
    while(num--)  
    {  
        int count=0,i;  
        scanf("%d %d",&n,&k);  
        record = n%a[k];  
        y = record;  
        for(i=2;i<=a[k];i++)//在10^k內必有迴圈,否則為不迴圈  
        {  
            count++;  
            y=y*n%a[k];//同餘定理,取模後去相乘不會影響  
            if(record==y)//找到首個相同的尾數即為迴圈  
            break;  
        }  
        if(i-1==a[k])  
        printf("-1\n");  
        else    
        printf("%d\n",count);  
    }  
    return 0;  
}