【BZOJ2742】【HEOI2012】Akai的数学作业 [数论]

news/2024/7/9 20:11:59 标签: 开发工具

Akai的数学作业

Time Limit: 10 Sec  Memory Limit: 128 MB
[Submit][Status][Discuss]

Description

  这里是广袤无垠的宇宙这里是一泻千里的银河,这里是独一无二的太阳系,这里是蔚蓝色的地球
  这里,就是这里,是富饶的中国大陆!
  这里是神奇的河北大地,这里是美丽的唐山,这里是神话般的唐山一中,这里是Akai曾经的教室
  黑板上还留有当年Akai做过的数学作业,其实也并不是什么很困难的题目:
  “
    给出一个一元n次方程:
    a0 + a1x + a 2 x2 +…+ anxn= 0
    求此方程的所有有理数解。
  ”
  Akai至今还深刻记得当年熬夜奋战求解的时光,他甚至还能记得浪费了多少草稿纸。
  但是却怎么也想不起来最后的答案是多少了,你能帮助他么?

Input

  第一行一个整数n。第二行n+1个整数,分别代表a0 到 an

Output

  第一行输出一个整数t,表示有理数解的个数
  接下来t行,每行表示一个解
  解以分数的形式输出,要求分子和分母互质,且分母必须是正整数特殊的,如果这个解是一个整数,那么直接把这个数输出
  等价的解只需要输出一次
  所有解按照从小到大的顺序输出

Sample Input

  3
  -24 14 29 6

Sample Output

  3
  -4
  -3/2
  2/3

HINT

  对于30%的数据,n <= 10 
  对于100%的数据,n <= 100,|a i| <= 2*10^7,an ≠ 0

Main idea

  给出一个一元n次方程:A0+A1*x+A2*x^2+…+An*x^n,求出这个方程的所有有理数解。

Solution

  这必然是一道数论题。首先我们发现了题目的一个非常重要的特征:求的是有理数解
  立马想到了分解因式,因为要的是有理数解,所以原方程肯定可以表示成:

  x就是q/p。

  然后再来思考一下。我们先从最简单的情况开始处理,也就是A0≠0,An≠0的情况。
  显然可以知道p一定是An分出来的,q一定是A0分出来的,那么一定有p是An的约数,q是A0的约数,那么这时候所有的情况就应该是

  仔细推一下式子,发现了一个规律:几个约数相乘的情况所表达出的集合和不考虑相乘情况的集合是一样的!那么处理就简单了很多。

  由于可能有前几项系数=0的情况,所以我们从A0的想法出发,找到第一个系数非0的项将这一项的约数存下来(如果不是A0的话则在答案中加一个0),然后从后往前找找到第一个非0的存下它的约数。然后O(约数个数)^2枚举任意两种情况的q/p放到原式里面判断(答案有可能是负数所以还要检查一下-q/p可不可行)然后在检查的时候发现了一个问题,数字要么精度误差过大要么就是爆出int范围了,我们想到了通分,分子分母同乘上p^n,避免了精度问题。

  以n=3的举个例子:将原式

  

  转化为

  然后我们就可以不管分母了,用这样的方法解决了精度问题。那么怎么解决爆int范围的问题呢?我们发现,在每次操作的时候都对一个质数取模的话错解的几率不是非常大,那么我们就可以大胆地取模几个质数来判断,如果不放心可以多取模几个。

  BearChild发现了一个神奇的质数:50033(如果使用这个质数的话是不需要用其余几个质数判断的)。

  这样进行累加和是否为0的判断,可行的话将每个答案存下来,然后sort一遍输出即可。

Code

  1 #include<iostream>  
  2 #include<algorithm>  
  3 #include<cstdio>  
  4 #include<cstring>  
  5 #include<cstdlib>  
  6 #include<cmath>  
  7 using namespace std;  
  8         
  9 const int ONE=501;
 10 const int MOD=50033;
 11 
 12 int n;
 13 int A[ONE];
 14 int divisor[ONE][3],num[3];
 15 int p[ONE];
 16 int q[ONE];
 17 int Repeat[ONE];
 18 int cnt;
 19 
 20 struct power
 21 {
 22         int l,r;
 23         int value;
 24 }a[ONE];
 25 
 26 int cmp(const power &a,const power &b)
 27 {
 28         return (double)a.l/a.r < (double)b.l/b.r;
 29 }
 30 
 31 int get()
 32 {
 33         int res,Q=1;    char c;
 34         while( (c=getchar())<48 || c>57)
 35         if(c=='-')Q=-1;
 36         if(Q) res=c-48; 
 37         while((c=getchar())>=48 && c<=57) 
 38         res=res*10+c-48; 
 39         return res*Q; 
 40 }
 41 
 42 int gcd(int a,int b)
 43 {
 44         int r=a%b;
 45         while(r)
 46         {
 47             a=b;
 48             b=r;
 49             r=a%b;
 50         }
 51         return b;
 52 }
 53 
 54 
 55 void Deal(int x,int PD)
 56 {
 57         for(int i=1;i<=x;i++)
 58         {
 59             if(!(x%i)) divisor[++num[PD]][PD]=i;
 60         }
 61 }
 62 
 63 int Check(int x,int y)
 64 {
 65         p[0]=q[0]=1;
 66         for(int i=1;i<=n;i++)
 67         {
 68             p[i]=(long long)p[i-1]*y % MOD;    q[i]=(long long)q[i-1]*x % MOD;
 69         }
 70         
 71         long long res=0;
 72         for(int i=0;i<=n;i++)
 73         {
 74             res=(res+(long long)p[n-i]*q[i]*A[i]) % MOD;
 75         }
 76         
 77         if(!res) return 1;
 78         return 0;
 79 }
 80 
 81 int main()
 82 {
 83         n=get();
 84         for(int i=0;i<=n;i++) A[i]=get();
 85         if(A[0]==0)
 86         {
 87             a[++cnt].l=0; a[cnt].r=1;
 88         }
 89         for(int i=0;i<=n;i++)
 90         {
 91             if(A[i])
 92             {
 93                 Deal(abs(A[i]),1);
 94                 break;
 95             }
 96         }
 97 
 98         for(int i=n;i>=0;i--)
 99         {
100             if(A[i])
101             {
102                 Deal(abs(A[i]),2);
103                 break;
104             }
105         }
106         
107         for(int i=1;i<=num[1];i++)
108         for(int j=1;j<=num[2];j++)
109         {
110             int x=divisor[i][1];
111             int y=divisor[j][2];
112             if(gcd(x,y)!=1) continue;
113             if(Check(x,y))
114             {
115                 a[++cnt].l=x;
116                 a[cnt].r=y;
117             }
118             if(Check(-x,y))
119             {
120                 a[++cnt].l=-x;
121                 a[cnt].r=y;
122             }
123         }
124         
125         sort(a+1,a+cnt+1,cmp);
126         printf("%d\n",cnt);
127         for(int i=1;i<=cnt;i++)
128         {
129             if(a[i].r==1) printf("%d\n",a[i].l);
130             else printf("%d/%d\n",a[i].l,a[i].r);
131         }
132         
133 }
View Code

 

转载于:https://www.cnblogs.com/BearChild/p/6442824.html


http://www.niftyadmin.cn/n/1217779.html

相关文章

cas5.3.2单点登录-集成客户端(六)

原文地址&#xff0c;转载请注明出处&#xff1a; https://blog.csdn.net/qq_34021712/article/details/81318649 ©王赛超 之前在服务端整合了数据库,也整合了shiro&#xff0c;我们一直是在服务端玩,登录跳转到登录成功页面,没啥意思,今天我们来将服务端和 客户端整…

[Node.js]全局对象

摘要 在js中的windows对象是全局对象&#xff0c;而Node.js中的全局对象是global&#xff0c;所有全局变量&#xff08;除global本身外&#xff09;都是global对象的属性。在Node.js中我们可以直接访问到global的属性&#xff0c;而不需要在应用中再次包含它。 全局对象与全局变…

cas5.3.2单点登录-集成客户端-传统spring方式(七)

原文地址&#xff0c;转载请注明出处&#xff1a; https://blog.csdn.net/qq_34021712/article/details/81347252 ©王赛超 上一篇博客,我们已经与客户端集成了,也实现了单点登录,一个系统登录之后,另一个系统无需再次登录&#xff0c;客户端是从官网下载的例子&…

cas5.3.2单点登录-集成客户端-springboot方式(八)

原文地址&#xff0c;转载请注明出处&#xff1a; https://blog.csdn.net/qq_34021712/article/details/81366646 ©王赛超 之前整合了客户端的demo&#xff0c;也和spring整合了,现在的很多项目,都已经开始使用springboot了&#xff0c;spring传统方式是配置在web.x…

MapReduce实战(二)自定义类型排序

需求&#xff1a; 基于上一道题&#xff0c;我想将结果按照总流量的大小由大到小输出。 思考&#xff1a; 默认mapreduce是对key字符串按照字母进行排序的&#xff0c;而我们想任意排序&#xff0c;只需要把key设成一个类&#xff0c;再对该类写一个compareTo&#xff08;大于要…

实现垂直水平居中的几种方法

1&#xff1a;用inline-block和vertical-align来实现居中&#xff1a;适用于未知宽高的情况 <!DOCTYPE html> <html lang"en"><head><meta charset"utf-8"><style>#container{text-align: center;height: 400px;background:…

cas5.3.2单点登录-编写自己的cas-starter(九)

原文地址&#xff0c;转载请注明出处&#xff1a; https://blog.csdn.net/qq_34021712/article/details/81486699 ©王赛超 前言 写这篇文章的原因是在springBoot整合cas的过程中,我使用了一个别人写好的starter &#xff0c;但是在整合单点登出的时候,发现多个客户…

cas5.3.2单点登录-自定义鉴权路径(十)

原文地址&#xff0c;转载请注明出处&#xff1a; https://blog.csdn.net/qq_34021712/article/details/81508273 ©王赛超 客户端整合cas之后,无论我们访问什么地址,只要没有发现票据,都会跳转到cas服务端去进行登录。有时候我们有这样的需求,用户不登录也可以访问某…