【nowcoder_挑戰賽31】克洛涅的多項式(構造)

鏈接:https://ac.nowcoder.com/acm/contest/880/B
來源:牛客網
 

題目描述 

克洛涅修女來到了這所孤兒院。Sister 很快就和大家打成一片,開始了捉迷藏的遊戲。

Sister 今天藏起來了一個 n 次的多項式 F(x)。同時,作爲線索,她給出了一個 m 次的多項式 G(x) 。這裏 m < n 。她又給出了一個有恰好 n 個不同元素的集合 S 。Sister 說,她藏起來的多項式滿足兩個性質:

 1. 最高次項係數爲 1 。

 2. 對於所有 S 中的元素 x ,都有 F(x) = G(x) 。即,∀x∈S,F(x)=G(x)∀x∈S,F(x)=G(x) 。

有了這些線索和條件, Sister 藏起來的多項式就可以被唯一確定了。諾曼心中已有了答案。那麼,你能不能找得比諾曼更快呢?

爲了方便,你只需要回答將 x=k 代入 Sister 的多項式後的值除以 998244353 後的餘數即可。也就是 F(k)mod998244353F(k)mod998244353 的值。

 

由於讀入文件較大,請使用較快的讀入方式。

這裏給出一個 C++ 的快速讀入板子:

namespace io {
    const int SIZE = 1e7 + 10;
    char inbuff[SIZE];
    char *l, *r;
    inline void init() {
        l = inbuff;
        r = inbuff + fread(inbuff, 1, SIZE, stdin);
    }
    inline char gc() {
        if (l == r) init();
        return (l != r) ? *(l++) : EOF;
    }
    void read(int &x) {
        x = 0; char ch = gc();
        while(!isdigit(ch)) ch = gc();
        while(isdigit(ch)) x = x * 10 + ch - '0', ch = gc();
    }
} using io::read;

在主程序中 read(x); 即可。

輸入描述:

輸入的第一行包含三個整數 n, m, k ,意義如題面所述。
第二行包含 n 個整數,表示所給出集合中的元素。保證集合中元素互不相同。
第三行包含 m+1 個整數,表示所給多項式 G(x) 的各項係數。這一行中第 i(1≤i≤m+1)i(1≤i≤m+1) 個數字表示 G(x) 中 xi−1xi−1 次項的係數。

輸出描述:

輸出僅一行,一個整數表示 F(k) 的值在模 998244353 意義下的結果。

示例1

輸入

複製

3 2 3
0 1 2
1 1 1

輸出

複製

19

說明

Sister 給出的多項式 G(x) 爲 x2+x+1x2+x+1 。集合 S 爲 {0, 1, 2} ,故 F(0) = G(0) = 1, F(1) = G(1) = 3, F(2) = G(2) = 7 。所以 F(x) 爲 x3−2x2+3x+1x3−2x2+3x+1 。答案爲F(3) = 19 。

備註:

0<m<n≤5×1060<m<n≤5×106

0≤k<9982443530≤k<998244353

0≤0≤ 多項式係數、S 中元素 <998244353

思路:

不想多說。。。不看題解死活不會,看了又秒懂,我真是佛了。。。多做題、多練吧。

#include <bits/stdc++.h>
#define maxn 5000010
#define ll long long
#define mod 998244353
using namespace std;

namespace io {
    const ll SIZE = 1e7 + 10;
    char inbuff[SIZE];
    char *l, *r;
    inline void init() {
        l = inbuff;
        r = inbuff + fread(inbuff, 1, SIZE, stdin);
    }
    inline char gc() {
        if (l == r) init();
        return (l != r) ? *(l++) : EOF;
    }
    void read(ll &x) {
        x = 0; char ch = gc();
        while(!isdigit(ch)) ch = gc();
        while(isdigit(ch)) x = x * 10 + ch - '0', ch = gc();
    }
} using io::read;

ll s[maxn],a[maxn];
int main(){
    ll n,m,k;
	read(n);
	read(m);
	read(k);
	//cout<<n<<" "<<m<<" "<<k<<endl; 
	int i;
	for(i=1;i<=n;i++)read(s[i]);
	for(i=0;i<=m;i++)read(a[i]);
	ll ans=a[0],_x=1;
	
	ll ji=1;
	for(i=1;i<=n;i++){
		ji*=(k-s[i]);
		ji=ji%mod;
	}
	
	for(i=1;i<=m;i++){
		_x=_x*k;_x=_x%mod;
		ans+=(a[i]*_x%mod);
		ans=ans%mod;
	}
	ans=ans+ji;
	ans%=mod;
	if (ans < 0) ans += mod;
	cout<<ans;
	return 0;
} 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章