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\; ...
随机推荐
- MySQL5.7(二)数据库的基本操作
登录MySQL数据库 格式:mysql -u 用户名 -h 主机名或IP地址 -P 端口号 -p 密码
- ci框架学习整理
-- -- 表的结构 `yi_article` -- CREATE TABLE IF NOT EXISTS `yi_article` ( `id` int(11) unsigned NOT NULL ...
- 使用CNN做数字识别和人脸识别
上次写的一层神经网络也都贴这里了. 我有点困,我先睡觉,完了我再修改 这个代码写法不太符合工业代码的规范,仅仅是用来学习的的.还望各位见谅 import sys,ossys.path.append(o ...
- Analysis 图标分析 - loadrunner
analysis常见 /
- CHAPTER 40 Science in Our Digital Age 第40章 我们数字时代的科学
CHAPTER 40 Science in Our Digital Age 第40章 我们数字时代的科学 The next time you switch on your computer, you ...
- dstat 性能测试工具常用选项
dstat常用的选项有: -c 显示cpu使用情况 -d 显示磁盘使用情况 -g, 显示页面数据 -i 启用中断数据 -l 平均负载统计(1分钟,5分钟,1 ...
- windows的滚动条使用
背景 在毕业快一年的工作时间中,对windows编程的某些特性并不够熟悉,例如滚动条的使用.在一次需求中需要用到滚动条,在开发过程中走了不少弯路,因此需要做一些笔记总结一下学习到的内容. 先推荐几个写 ...
- DNS分离解析IPV6与IPV4用户
IPV6改造中经常会遇到,网站使用了CDN,但是CDN厂商还不支持IPV6的情况,而AAAA.A.CNAME记录互相冲突,想实现IPV6用户得到AAAA记录,IPV4用户得到CNAME记录的需求. 解 ...
- Django_杂
1.url带一些GET参数"url?a=1&b=2",通过QueryDict以及其urlencode()进行处理 from django.http.request impo ...
- 机器装多个版本php,并安装redis插件报错【已解决】
机器原版本php5.5.3 适应新的框架安装了7.1.12 期间遇到的小问题就是安装 redis插件的时候,总报错,报错如下: Starting php-fpm [02-Jan-2019 10:15: ...