1. 程式人生 > >題解【洛谷P5248】 [LnOI2019SP]快速多項式變換(FPT)

題解【洛谷P5248】 [LnOI2019SP]快速多項式變換(FPT)

直接 esp gis display clas lin ase 題解 getch

題目描述

這是一道構造題。

詩乃在心中想了一個n+1項的多項式f(x)。第i項的次數為i,系數為ai:

  f(x)=a0?+a1?*x+a2?*x2+a3?*x3+?+an*?xn

給定m以及f(m)的值(即當x=m時此多項式的值),請構造多項式,滿足任意0≤ai<m且ai為非負整數。

設你構造的多項式項數為n,則必須滿足1≤n≤100且最高項系數不為零。

輸入輸出格式

輸入格式:

兩個整數,mf(m)

輸出格式:

第一行輸出正整數n,表示多項式的項數。

第二行依次輸出n個非負整數(a[0]至a[n-1]),每個非負整數之間用一個空格隔開。

輸入輸出樣例

輸入樣例#1:
10 10
輸出樣例#1:
2
0 1

說明

對於20%的數據, 2≤m≤5.

對於100%的數據, 2≤m,f(m)≤1018.

所有數據的時間限制為 1000ms,空間限制為 256MB,可開啟O2優化。

題解

這是一道數學題。

在輸入完後,我們先預處理處≤f(m)的所有m的次方,然後以次計算a0到an(n為≤f(m)的m的次方的最大指數),註意a0到an都不能≥m,開long long!!!

最後,特判一下m>f(m)的情況就可以AC啦!

附AC代碼:

 1 #include <bits/stdc++.h> //
萬能頭文件 2 #define int long long //把int都定義成 long long 3 4 using namespace std; //使用標準名字空間 5 6 inline int read() //快速讀入 7 { 8 int f = 1, x = 0; 9 char c = getchar(); 10 11 while (c < 0 || c > 9) 12 { 13 if (c == -) 14 f = -1; 15 c = getchar();
16 } 17 18 while (c >= 0 && c <= 9) 19 { 20 x = x * 10 + c - 0; 21 c = getchar(); 22 } 23 24 return f * x; 25 } 26 27 int n, m, a[105], fm, S = 1, s[105], cnt = -1; 28 29 signed main() //註意不能用int main(),因為我們已經在一開始把int都轉換成了long long 30 { 31 m = read(), fm = read(); //讀入m和f(m) 32 33 if (m > fm) //特判m>f(m)的情況 34 { 35 printf("1\n%lld", fm); //直接輸出1和f(m) 36 37 return 0; 38 } 39 40 while (true) //預處理處所有≤f(m)的m的次方 41 { 42 if (S > fm) //如果已經比f(m)大了 43 { 44 break; //就退出 45 } 46 else 47 { 48 s[++cnt] = S; //否則記錄下這個數 49 50 S = S * m; //將它*m 51 } 52 } 53 54 int b = fm; //b為f(m)的復制品 55 56 a[++n] = fm % m; //預處理處a0(常數項) 57 58 b = b - fm % m; //減去常數項 59 60 for (register int i = 1; i <= cnt; i++) 61 { 62 a[++n] = (b / s[i]) % m; //依次計算每一位 63 } 64 65 printf("%lld\n", n); //輸出n 66 67 for (register int i = 1; i <= n; i++) 68 { 69 printf("%lld ", a[i]); //輸出a[i] 70 } 71 72 return 0; //結束 73 }

題解【洛谷P5248】 [LnOI2019SP]快速多項式變換(FPT)