codeforce453DIV2——D. GCD of Polynomials
2024-09-01 16:44:46
题意
给出n(1–150).
输出两个多项式A,B从常数到最高次的系数,使得对两个多项式求gcd时,恰好经过n步得到结果.
多项式的gcd一步是指(A(x),B(x))变成(B,A mod B)的过程,且当A mod B为0时,视为得到结果B.
A mod B为多项式求余,参见 long division.
要求两个多项式的所有系数都是1,0,-1.前导系数(最高次项系数)为1,度数(最高次)不超过n,第一个多项式的度数大于第二个
分析:
这个题懵逼了好几天,题解愣是没看懂,来学校后在宿舍用笔划拉了好久终于大概是了解了是怎么回事了。
逆推一下GCD的公式:GCD(A,B)=GCD(AX+B,A)。所以可以得到An=An-1*X+An-2。但是题目中有个限制每一位的系数的绝对值不大于1。将GCD变形可以得到GCD(AX+B,A)=GCD(AX-B,A),所以在递推的时候如果系数超过1,那么相减,否则相加。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream> using namespace std;
const int maxn=+;
int a[maxn][maxn];
int n; int main(){
scanf("%d",&n);
a[][]=;a[][]=;
for(int i=;i<=n;i++){
for(int j=;j<=i;j++){
if(j>)
a[i][j]=a[i-][j-];
if(j<=i-){
if(a[i][j]+a[i-][j]>)
a[i][j]-=a[i-][j];
else
a[i][j]+=a[i-][j];
}
}
}
printf("%d\n",n);
for(int i=;i<=n;i++){
printf("%d ",a[n][i]);
}
printf("\n");
printf("%d\n",n-);
for(int i=;i<n;i++){
printf("%d ",a[n-][i]);
}
return ;
}
最新文章
- web 前端(轮番插件)
- 一个ubuntu phper的自我修养(atom)
- CANVAS 水波动态背景
- LEFT JOIN 多表查询的应用
- springmvc 通过异常增强返回给客户端统一格式
- js Memoization 优化运行速度
- Makefile学习与进阶之Makefile.am和$$(M)的意思
- Core Animation之CABasicAnimation
- android 回车键事件编程
- 借助共享缓存redis实现分布式锁
- HDU - 5036 Operation the Sequence
- 《Python高效开发实战》实战演练——内置Web服务器4
- 函数之局部变量和使用global语句
- SQL Server的case when用法
- python基础_格式化输出(%用法和format用法)
- python读写文件\r\n问题
- logback框架之——日志分割所带来的潜在问题
- Dispatch Queue 内存结构
- ListView 控件和 INotifyPropertyChanged 接口
- docker之容器数据持久化