ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【AtCoder】P137F Folynomial Consruction

2019-08-11 09:54:43  阅读:253  来源: 互联网

标签:AtCoder int 多项式 Folynomial times Consruction equiv 10100 mod


数论

由于p是素数,考虑到费马小定理:

\[ a^{p-1} \equiv 1 (mod p) \]

而再观察,函数\(f(x)\)要求的值都是0或1
那么,将费马小定理变一下:

\[ (x-i)^{p-1} \equiv 1 (mod p)(x \neq i) \]

\[ (x-i)^{p-1} \equiv 0 (mod p)(x = i) \]

我们定义一个p-1次多项式\(g(x)=b_0+b_1 \times x+b_2 \times x^2+...+b_{p-1} \times x^{p-1}\),且该多项式初始值为0
那么,对于一个\(A_i\),若\(A_i=1\),我们可以在\(g(x)\)中加上\(1-(x-i)^{p-1}\)。因为根据上述式子,我们可以得知在模p下,当且仅当x=i时,\(1-(x-i)^{p-1}\)的值才为1,否则都为0。也就是说,\(1-(x-i)^{p-1}\)只会影响x=i的情况(将其值变为1)。
然后在多项式展开就行了。
代码(注意负数取模):

    #include<bits/stdc++.h>
    using namespace std;
    int n,A[10100],cnt[10010],ans[10100],C[3000][3000];
    void init(){
        C[0][0]=1;
        for(int i=1;i<=n;i++){
            C[i][0]=1;
            for(int j=1;j<=i;j++){
                C[i][j]=(C[i-1][j]+C[i-1][j-1])%n;
            }
        }
    }
    int main(){
        scanf("%d",&n);
        init();
        for(int i=0;i<n;i++)scanf("%d",&A[i]);
        for(int i=0;i<n;i++){
            if(A[i]==1)cnt[i]++,ans[0]++;
        }
        for(int i=0;i<n;i++){
            if(cnt[i]==0)continue;
            for(int j=0,po=1;j<n;j++){
                int res=C[n-1][j]*po;
                res%=n;
                if(res<0){
                    int tmp=abs(res);
                    res=(n-tmp%n)%n;
                }
                else res=res%n;
                ans[n-1-j]=(ans[n-1-j]+n-res)%n;
                po=po*(-i);
                if(po<0){
                    int tmp=abs(po);
                    po=(n-tmp%n)%n;
                }
                else po=po%n;
            }
        }
        for(int i=0;i<n;i++)printf("%d ",ans[i]);
        return 0;
    }

标签:AtCoder,int,多项式,Folynomial,times,Consruction,equiv,10100,mod
来源: https://www.cnblogs.com/SillyTieT/p/11333969.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有