LOJ #525. 「LibreOJ β Round #4」多项式

本文探讨了如何构造一个特定的多项式f(x),其系数在0到k-1之间,且对于所有整数x,f(x)模k等于0。利用扩展欧拉定理,给出了构造方法,并提供了实现代码。

LOJ #525. 「LibreOJ β Round #4」多项式

题意

给定一个正整数 k k ,你需要寻找一个系数均为 0 k1 k − 1 之间的非零多项式 f(x) f ( x ) ,满足对于任意整数 x x 均有 f(x)0(mod k) k )


题解

我们知道欧拉定理是:若 a 与 n 互质,则 aϕ(n)1(mod a ϕ ( n ) ≡ 1 ( m o d n) n )

这里我们提出扩展欧拉定理:任意正整数 x x ,都有 nxnx(modφ(p))+φ(p) (mod ( m o d p) p )

所以我们可以得到 nx+φ(p)nx0 n x + φ ( p ) − n x ≡ 0 (mod ( m o d p) p )

我们可用令 x=φ(p) x = φ ( p ) 就可以得到一个正确式子

然而题目要求系数不能为负数

所以我们给式子加上一个 knx k ⋅ n x

也就可以得到 nφ(p)+φ(p)+(k1)nφ(p)0 n φ ( p ) + φ ( p ) + ( k − 1 ) n φ ( p ) ≡ 0 (mod ( m o d p) p )

然后求一个 phi p h i 就可以了


代码

#include <cstdio>
int k;
int gcd(int x,int y){
    if(!y) return x;
    return gcd(y,x%y);
}
int main(){
    scanf("%d",&k);
    if(k==1){puts("-1");return 0;}
    int phi=1;
    for(int i=2;i<k;i++) if(gcd(i,k)==1) phi++;
    printf("%d\n",phi<<1);
    for(int i=0;i<phi;i++) printf("0 ");
    printf("%d ",k-1);
    for(int i=phi+1;i<(phi<<1);i++) printf("0 ");
    printf("1");
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值