NOIp 2014 #5 解方程 Label:数论?
2024-08-30 11:31:40
题目描述
已知多项式方程:
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
代码
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define ll long long
using namespace std; ll v[],a[],ans,N,M,p; ll pow(ll x,ll n){
ll ans=;
while(n){
if(n&) ans=ans*x;
x=x*x;
n>>=;
}
return ans;
} ll cc(ll x){
ll ans=a[];
for(ll i=;i<=N;i++){
ans+=a[i]*pow(x,i);
}
if(ans==) {
v[++p]=x;
return ;
}
return ;
} int main(){
// freopen("equation.in","r",stdin);
// freopen("equation.out","w",stdout); scanf("%lld%lld",&N,&M);
for(ll i=;i<=N;i++){
scanf("%lld",&a[i]);
} for(ll i=;i<=M;i++){
if(cc(i)) ++ans;
} printf("%lld\n",ans);
for(ll i=;i<=p;i++) printf("%lld\n",v[i]); return ;
}不会写,水过了30分,QAQ
转载:
没有c++题解,果断来一发
50%数据:
从1到m暴力枚举答案,然后通过高精度进行计算。
70%数据:
仍然从1到m暴力枚举答案,但是我们不再进行高精度运算,而是模质数。为了减小冲突的几率,我们可以多选几个数字去模。这样时间复杂度是O(nmprime),其中prime是选取的质数的数量,选四五个就行。
100%数据:
如果我们模的数字是k。左边式子带入x和带入x+k是没有区别的。如果我们把质数k取得小一些,这样x就不用试1~m,而是试1~k。这样复杂度就变成了O(nkprime),如果k取10^4左右就完全没有问题。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
using namespace std;
#define PROB "equation"
#define MAXN 1100001
ifdef WIN32 #define LL "%I64d"
#else
#define LL "%lld"
#endif
typedef long long qword;
const int mod[] =
{,,,,
};
int a[][];
bool ok[MAXN];
bool ok2[][];
char s[];
int n,m;
void work();
int main()
{
int ii,i,j, k;
int x;
scanf("%d%d\n",&n,&m);
int ll = ;
for (ii=;ii<=n;ii++)
{
// scanf("%s", s);
fgets(s,sizeof(s),stdin);
int l = strlen(s)-;
if((s[l-]<'' || s[l-]>'') && s[l-]!='-')l--;
for(int j = ; j < ll; j ++){
int pmod = mod[j];
a[j][ii] =;
x=;
k=;
if (s[k]=='-')k++,x=-x;
else if (s[k]=='+')k++;
for (;k<l;k++)
{
a[j][ii]=(a[j][ii]*+s[k]-'')%pmod;
}
a[j][ii]=a[j][ii]*x%pmod;
if(a[j][ii] < )
a[j][ii] += pmod;
}
}
memset(ok,,sizeof(ok));
memset(ok2,,sizeof(ok2));
int pmod;
int ans;
for (ii=;ii<ll;ii++)
{
pmod=mod[ii];
for (i=;i<pmod;i++)
{
ans=;
for (j=n;j>=;j--)
{
ans=(ans * i + a[ii][j])%pmod;
}
if (ans)
{
ok2[ii][i]=false;
}
}
}
int cnt = ;
for (int i=;i<=m && cnt <= n;i++)
{
for (int j=;j<ll;j++)
{
if (!ok2[j][i%mod[j]]){
ok[i]=false;
break;
}
}
if(ok[i])
++ cnt;
}
printf("%d\n",cnt);
for (i=;i<=m;i++)
if (ok[i])
printf("%d\n",i);
return ;
}
最新文章
- python3爬取1024图片
- 使用Unity3d做异形窗口
- 在ListActivity中显示图标
- HTML/HTML5/CSS/CSS3教程速查手册地址以及如何快速直到webkit的用法
- jQuery1.9.1源码分析--数据缓存Data模块
- Mac OS X 懒人版安装教程(之前的图全部挂了,所以重发了)
- ruby -- 进阶学习(三)Strong Parameters在rail3.0和4.0中的区别
- xargs -n1 -t
- Golang gRPC 示例
- linux网络编程_1
- 【C语言学习】-05 二维数组、字符串数组、多维数组
- Eclipse版本及其代号
- 转:android 设计模式合集
- win8 64位操作系统 Microsoft Visual Studio 2010在IIS上调试 “此任务要求应用程序具有提升的权限”等问题
- 便利的html5 之 required、number 、pattern
- C语言基础11
- C#实现 ffmpeg视频转码、播放
- WebServices客户端代码生成
- python实现线性回归
- .NET core RSA帮助类