BZOJ 2742: [HEOI2012]Akai的数学作业
2742: [HEOI2012]Akai的数学作业
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 535 Solved: 226
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
-24 14 29 6
Sample Output
-4
-3/2
2/3
HINT
【数据范围】
对于30%的数据,n<=10
对于100%的数据,n <= 100,|a i| <= 2*10^7,an≠ 0
Source
好神的一道HEOI题。
据LH讲,有个定理叫做多项式高斯引理什么的,大概就是讲,复数域下的一个关于$x$的$n$次多项式$f(x)=a_{0}+a_{1}x+a_{2}x^{2}+a_{3}x^{3}+...+a_{n}x^{n}$一定可以分解成$n$个含$x$的一次多项式相乘,即$f(x)$一定存在一种形如$f(x)=\prod{(b_{i}x+c_{i})}$的表示,其中每个式子都会产生一个复数域下的根(当然,这些根有可能重复)。这道题叫我们只用考虑有理数根,所以可以把式子改写为$f(x)=g(x)*\prod{(b_{i}x+c_{i})}$的样子,其中g(x)是一个关于$x$的多项式,包含了所有的非有理数根,剩下的部分就表示了所有的有理数根。发现每个有理数根都能表示成$x_{i}=\frac{c_{i}}{b_{i}}$,然后不难发现$f(x)=\sum_{i=0}^{n}{a_{i}x^{i}}$中的$a_{0}$包含了所有的$c_{i}$,而$a_{n}$包含了有所的$b_{i}$,所以对于所有的合法有理数根$x_{i}=\frac{c_{i}}{b_{i}}$,$c_{i}$一定是$a_{0}$的约数,$b_{i}$一定是$a_{n}$的约数。所以可以先处理出$a_{0}$和$a_{n}$的所有约数,然后暴力枚举$b_{i}$和$c_{i}$,$O(N)$check是否合法即可。check的方式是,对于$x=\frac{p}{q}$,$f(x)=\sum_{i=0}^{n}{a_{i}p^{i}q^{n-i}}$,在模意义下检查是否为$0$即可。
#include <bits/stdc++.h> template <class T>
T gcd(T a, T b)
{
return b ? gcd(b, a % b) : a;
} typedef long long lnt; const int mxn = ;
const int mxm = ;
const lnt mod = ; int n, s[mxn]; struct number
{
int a, b, f; // ans = a / b number(void) {};
number(int x, int y, int g = )
: a(x), b(y), f(g) {}; void print(void)
{
if (f == -)
putchar('-');
if (a % b)
printf("%d/%d\n", a, b);
else
printf("%d\n", a / b);
}
}ans[mxm]; int tot; bool cmp(const number &A, const number &B)
{
if (A.f == - && B.f == +)
return true;
if (A.f == + && B.f == -)
return false;
if (A.f == + && B.f == +)
return 1LL * A.a * B.b < 1LL * B.a * A.b;
if (A.f == - && B.f == -)
return 1LL * A.a * B.b > 1LL * B.a * A.b;
} void leadingZeros(void)
{
int cnt = ; while (!s[cnt])
++cnt; if (cnt)
{
n = n - cnt; for (int i = ; i <= n; ++i)
s[i] = s[i + cnt]; ans[tot++] = number(, );
}
} int divA[mxm], sizA;
int divB[mxm], sizB; void divide(int x, int *div, int &siz)
{
if (x < )x = -x; siz = ; int t = int(sqrt(x)); for (int i = ; i <= t; ++i)
if (x % i == )
{
div[siz++] = i;
div[siz++] = x / i;
} if (t * t == x)--siz;
} int powA[mxn];
int powB[mxn]; void check(lnt a, lnt b, lnt f)
{
powA[] = powB[] = 1LL; for (int i = ; i <= n; ++i)
{
powA[i] = (powA[i - ] * a) % mod;
powB[i] = (powB[i - ] * b) % mod;
} lnt sum = , tmp; for (int i = ; i <= n; ++i)
{
tmp = s[i];
tmp = (tmp * powA[i]) % mod;
tmp = (tmp * powB[n - i]) % mod; if (i & )tmp = (tmp * f + mod) % mod; sum = (sum + tmp) % mod;
} if (sum == )ans[tot++] = number(a, b, f);
} signed main(void)
{
scanf("%d", &n); for (int i = ; i <= n; ++i)
scanf("%d", s + i); leadingZeros(); divide(s[], divA, sizA);
divide(s[n], divB, sizB); for (int i = ; i < sizA; ++i)
for (int j = ; j < sizB; ++j)
{
int a = divA[i];
int b = divB[j]; if (gcd(a, b) == )
{
check(a, b, +);
check(a, b, -);
}
} std::sort(ans, ans + tot, cmp); printf("%d\n", tot); for (int i = ; i < tot; ++i)
ans[i].print();
}
@Author: YouSiki
BZOJ 2742: [HEOI2012]Akai的数学作业的更多相关文章
- [BZOJ2742][HEOI2012]Akai的数学作业[推导]
题意 给定各项系数,求一元 \(n\) 次方程的有理数解. \(n\leq 100\). 分析 设答案为 \(\frac{p}{q}\) ,那么多项式可以写成 \(a_0\frac{p}{q}+a_1 ...
- 【BZOJ2742】【HEOI2012】Akai的数学作业 [数论]
Akai的数学作业 Time Limit: 10 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description 这里是广袤无垠的宇宙这里 ...
- BZOJ 2326: [HNOI2011]数学作业( 矩阵快速幂 )
BZOJ先剧透了是矩阵乘法...这道题显然可以f(x) = f(x-1)*10t+x ,其中t表示x有多少位. 这个递推式可以变成这样的矩阵...(不会用公式编辑器...), 我们把位数相同的一起处理 ...
- BZOJ-2326 数学作业 矩阵乘法快速幂+快速乘
2326: [HNOI2011]数学作业 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 1564 Solved: 910 [Submit][Statu ...
- bzoj2326: [HNOI2011]数学作业
矩阵快速幂,分1-9,10-99...看黄学长的代码理解...然而他直接把答案保存在最后一行(没有说明...好吧应该是我智障这都不知道... #include<cstdio> #inclu ...
- CJOJ 1331 【HNOI2011】数学作业 / Luogu 3216 【HNOI2011】数学作业 / HYSBZ 2326 数学作业(递推,矩阵)
CJOJ 1331 [HNOI2011]数学作业 / Luogu 3216 [HNOI2011]数学作业 / HYSBZ 2326 数学作业(递推,矩阵) Description 小 C 数学成绩优异 ...
- [luogu P3216] [HNOI2011]数学作业
[luogu P3216] [HNOI2011]数学作业 题目描述 小 C 数学成绩优异,于是老师给小 C 留了一道非常难的数学作业题: 给定正整数 N 和 M,要求计算 Concatenate (1 ...
- P3216 [HNOI2011]数学作业 (矩阵快速幂)
P3216 [HNOI2011]数学作业 题目描述 小 C 数学成绩优异,于是老师给小 C 留了一道非常难的数学作业题: 给定正整数 NN 和 MM ,要求计算 Concatenate (1 .. N ...
- [HNOI2011]数学作业 --- 矩阵优化
[HNOI2011]数学作业 题目描述: 小 C 数学成绩优异,于是老师给小 C 留了一道非常难的数学作业题: 给定正整数 N 和 M ,要求计算\(Concatenate(1..N)\; Mod\; ...
随机推荐
- HDFS文件系统基础
HDFS架构实现 Hadoop当前稳定版本是Apache Hadoop 2.9.2,最新版本是Apache Hadoop 3.1.1. http://hadoop.apache.org/docs/ H ...
- linux的date命令使用指定时间的加减方法与异常
在一般网页里,date命令减时间方法为: date -d '-100 days' 我的需求是,在指定时间上减8小时.按一般理解来看,命令写成如下样子(有异常错误的写法): date -d " ...
- 【RL系列】MDP与DP问题
推荐阅读顺序: Reinforcement Learning: An Introduction (Drfit) 有限马尔可夫决策过程 动态编程笔记 Dynamic programming in Py ...
- 【一】,python简单爬虫实现
一: 1.获取当前页的课程名称,地址:https://www.ichunqiu.com/courses/webaq 2.选取其中一门课程名称查看源代码: 代码如下: <p class=" ...
- 入门向:南邮CTF_ReadAsm2_WP
题目链接:http://ctf.nuptzj.cn/challenges#ReadAsm2 我比较菜,所以把思路全部敲上来了. 题目很明确告诉我们,这道题考察阅读汇编代码的能力. 在对编译环境和调用约 ...
- 亚马逊如何变成 SOA(面向服务的架构)
. 亚马逊公司不仅是世界最大的网络书店,还是世界最大的云服务商.它是怎么实现从电商到云商的转变呢? 一切都是CEO杰夫·贝索斯促成的,他对市场有着超乎常人的理解和预见. 2. 2000年前后,贝索斯有 ...
- React Native (0.57)开发环境搭建(注意:Node不要随便更新到最新版,更新完后莫名其妙的问题一大堆)
搭建开发环境 一.安装依赖 必须安装的依赖有:Node.Watchman 和 React Native 命令行工具以及 Xcode. 1.首先安装 Homebrew 2.安装 Node, Watchm ...
- iOS 静态库 与 demo 联合调试
在修复bug或者开发静态库需要调试,这个时候需要把工程中的.framework和资源bundle文件都替换为静态库原工程文件 首先需要确保静态库工程文件没有打开,Xcode不允许在两个地方同时打开同一 ...
- [C#] 取得每月第一天和最後一天、某月总天数
思路: 1. DateTime dt= DateTime.Now; //获取当前时间 eg:2013-09-08 09:25:0 0 2. DateTime dt1 = new DateTime(d ...
- Notes of Daily Scrum Meeting(11.13)
Notes of Daily Scrum Meeting(11.13) 今天邹欣老师给我们讲课大家还是很有收获的,大家课堂的参与度确实有了很大的提升,而且邹欣老师关于项目Scrum Meeting报告 ...