码迷,mamicode.com
首页 > 其他好文 > 详细

解方程

时间:2018-02-22 16:41:16      阅读:137      评论:0      收藏:0      [点我收藏+]

标签:namespace   sam   read   include   int   sdi   输入格式   out   turn   

题目描述

已知多项式方程:

a0+a1x+a2x^2+..+anx^n=0

求这个方程在[1, m ] 内的整数解(n 和m 均为正整数)

输入输出格式

输入格式:

 

输入文件名为equation .in。

输入共n + 2 行。

第一行包含2 个整数n 、m ,每两个整数之间用一个空格隔开。

接下来的n+1 行每行包含一个整数,依次为a0,a1,a2..an

 

输出格式:

 

输出文件名为equation .out 。

第一行输出方程在[1, m ] 内的整数解的个数。

接下来每行一个整数,按照从小到大的顺序依次输出方程在[1, m ] 内的一个整数解。

 

输入输出样例

输入样例#1: 
2 10 
1
-2
1
输出样例#1: 
1
1
输入样例#2: 
2 10
2
-3
1
输出样例#2: 
2
1
2
输入样例#3: 
2 10 
1  
3  
2  
 
输出样例#3: 
0

说明

对于30%的数据:0<n<=2,|ai|<=100,an!=0,m<100

对于50%的数据:0<n<=100,|ai|<=10^100,an!=0,m<100

对于70%的数据:0<n<=100,|ai|<=10^10000,an!=0,m<10000

对于100%的数据:0<n<=100,|ai|<=10^10000,an!=0,m<1000000

暴力:30分

正解:枚举[1,m}内的数,然后用秦九昭算法计算多项式的值O(n*m)

**:因为输入数据很大,所以在边输入边取模,这是我想到的,但是却没有想到点上。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<queue>
 5 #include<algorithm>
 6 #include<cstring>
 7 #include<string>
 8 #define ll long long
 9 #define mod 1000000007
10 using namespace std;
11 ll n,m,a[120];
12 inline ll read()
13 {
14     ll x=0,w=1;char ch=getchar();
15     while(!isdigit(ch)){if(ch==-) w=-1;ch=getchar();}
16     while(isdigit(ch)) x=((x<<3)+(x<<1)+ch-0)%mod,ch=getchar();
17     return x*w%mod;
18 }
19 ll cnt,ans[1000010];
20 bool ok(ll x)
21 {
22     ll k=0;
23     for(ll i=n;i>=0;--i)
24      k=(k*x+a[i]%mod)%mod;
25     return (k==0);
26 }
27 int main()
28 {
29     n=read();m=read();
30     for(ll i=0;i<=n;++i) a[i]=read();
31     for(ll i=1;i<=m;++i)
32      if(ok(i)) ans[++cnt]=i;
33     printf("%lld\n",cnt);
34     for(ll i=1;i<=cnt;++i)
35      printf("%lld\n",ans[i]);
36     return 0;
37 }

等待思维之花的绽放。

解方程

标签:namespace   sam   read   include   int   sdi   输入格式   out   turn   

原文地址:https://www.cnblogs.com/adelalove/p/8458304.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!