1. 程式人生 > >P1-2017級第一次演算法上機 D 芸茹的課堂測試

P1-2017級第一次演算法上機 D 芸茹的課堂測試

題目描述

霍納(Horner)規則是一種將一元n次多項式的求值問題轉化為n個一次式的演算法。採用最小的乘法運算策略,用於求多項式A(x)=a0+a1x+a2x2+...+an−1xn−1+anxnx處的值,轉化為A(x)=a0+x(a1+x(a2+...+x(an−1+xan)⋅⋅⋅))。其虛擬碼如下:

y = 0
for i = n downto 0
    y = ai + x * y
				

給一個8進位制數,這個數很大,他的長度甚至可以達到1e6(即106次方)。請輸出這個數十進位制意義下對1e9+7取模(即取餘數)的結果。

輸入

第一個數為資料組數nn <= 10

每組資料包括一行,一個大整數S,表示給定的8進位制數xS在字串意義下長度不超過1e6

輸出

對於每組資料,輸出一行,為其十進位制下對1e9+7取模的值。

輸入樣例

2
22
2222222222222222222
				

輸出樣例

18
733442737
				

思路

本題是一個簡單的霍納法則的應用類問題。

霍納法則:

多項式

A(x)=a0+a1x+a2x2+...+an−1xn−1+anxn

x處的值,轉化為

A(x)=a0+x(a1+x(a2+...+x(an−1+xan)⋅⋅⋅))

由於非十進位制數向十進位制數的轉換可以按位轉換再相加,剛好和霍納法則的形式相近,使用霍納法則可以大大降低程式的時間複雜度。

    本題的資料由於位數太長,在讀入的時候需要用字串讀入,在運算的時候,用-'0'的方法,累位轉化為數字即可。

    說明一下,由於待計算的數字是按照數字的高位儲存在陣列的低位中的順序儲存的,因此剛好符合霍納法則中,從最內層括號向外層層計算的順序。

    程式碼中的x可變為1-9中的任意數字,因此原始碼可轉化為任何進位制數轉化為十進位制數的程式碼。

參考程式碼

 1 #include<stdio.h>  
 2 #include<string
.h> 3 #define Mod 1000000007 4 #define MAXN 1000002 5 char s[MAXN]; 6 int main() 7 { 8 int x = 8; 9 int n; 10 scanf("%d",&n); 11 while(n--){ 12 scanf("%s",s); 13 int len = strlen(s); 14 int i; 15 long long res = 0; 16 for(i = 0;i < len;i++) 17 res = (res * x +(s[i] - '0')) % Mod; 18 printf("%lld\n",res); 19 } 20 21 return 0; 22 }