列表

详情


NC229827. 金属制品

描述

小 D 有一个多项式,具体来说这是一个模素数 p 意义下的 n 次多项式。然而小 D 只知道这个多项式的系数表示,他觉得这个形式不够美观,他希望将这个多项式分解成 n 个一次因式的乘积,你能帮帮他么?
形式化的问题是,给出 n,p 和  ,希望你求出序列 k 使得模素数 p 意义下 

输入描述

第一行包含一个正整数 n 和一个素数
第二行包含  个自然数表示系数序列 。保证 

输出描述

输出包含一行 n 个正整数,请将题目所求 k 序列按照从小到大的顺序输出,输入保证有且仅有一组解

示例1

输入:

3 5
4 1 4 1

输出:

2 3 4

示例2

输入:

3 5
1 1 1 1

输出:

1 2 3

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(g++ 7.5.0) 解法, 执行用时: 518ms, 内存消耗: 512K, 提交时间: 2022-08-18 18:11:32

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
  
int main() {
    int n, p;
    cin >> n >> p;
    vector<int> a(n + 1);
    for(int i = 0; i <= n; ++i) cin >> a[i];
    vector<int> ans;
    for(int i = 0; i < p; ++i) {
        int f = 1;
        while(f) {
            f = 0;
            int cur = a.back();
            vector<int> nxt;
            for(int j = a.size() - 1; j >= 1; --j) {
                nxt.push_back(cur);
                cur = ((a[j - 1] - cur * i) % p + p) % p;
            }
            reverse(nxt.begin(), nxt.end());
            if(cur == 0) {
                f = 1;
                a = nxt;
                ans.push_back(i);
            }
        }
    }
    for(int i : ans) cout << i << " "; cout << '\n';
}

C++ 解法, 执行用时: 486ms, 内存消耗: 436K, 提交时间: 2021-11-21 16:48:36

#include<stdio.h>
#include<iostream>
using namespace std;
const int N=5010;
int n,p,a[N];
int get_poly(int x){
    int pow=1,res=0;
    for(int i=0;i<=n;i++){
        res=(res+a[i]*pow)%p;
        pow=(pow*x)%p;
    }
    return res;
}
int main(){
    scanf("%d%d",&n,&p);
    for(int i=0;i<=n;i++)scanf("%d",&a[i]);
    int ans=p;
    while(n){
        while(get_poly(ans))ans--;
        int k=p-ans;
        printf("%d ",k);
        for(int i=n-1;i>=0;i--)
            a[i]=((a[i]-k*a[i+1])%p+p)%p;
        for(int i=0;i<n;i++)a[i]=a[i+1];
        n--;
    }
    return 0;
}

上一题