Processing math: 100%

洛谷P2312解方程题解

题目

暴力能得30,正解需要其他的算法操作,算法操作就是用秦九韶算法来优化。

秦九韶算法就是求多项式的值时,首先计算最内层括号内一次多项式的值,然后由内向外逐层计算一次多项式的值,然后就将求n次多项式的算法转化为求n个一次多项式的算法。

但是这样只能得到30分,用高精也只能拿50分,所以此时可以用模数意义下的hash来解决,设置模数为1e9+7(或者其他比较大的模数),就可以来优化时间,虽然有很可能会错,但是还是可以用很快的时间来解决,且错的几率是非常的小的。

#include <bits/stdc++.h>
#define N 100100
#define mod 1000000007
#define ll long long
using namespace std;
ll n, m, ans, a[N], x[N];
bool flag = 0;
inline ll read()
{		
	char ch; ll sum = 0, fu = 1; ch = getchar();
	while (ch < '0' || ch > '9') {	
		if (ch == '-') fu = -1;
		ch = getchar();
	}	
	while (ch >= '0' && ch <= '9') {	
		sum =  ( (sum * 10) + ch - '0') % mod;
		ch = getchar();
	}	
	return sum * fu;
}
bool check(ll now) {					
	ll sum = 0;						
	for (int i = n; i >= 0; i--) 	
		sum = (  (sum + a[i]) * now ) % mod;
	if (sum) return 0;
	else return 1;	
} 					
int main()			
{						
 	scanf("%lld%lld", &n, &m);
 	for (int i = 0; i <= n; i++) 
 		a[i] = read();
 	/*
 	for (int i = 0; i <= n; i++)
		printf("%lld ", a[i]);	
		*/ 
	for (int i = 1; i <= m; i++)
 		if ( check (i) )
 			x[++ans] = i, flag = 1;	
 	if (!flag)		
 		printf("0"), exit(0);
 	printf("%lld\n", ans);
 	for (int i = 1; i <= ans; i++)
 		printf("%lld\n", x[i]);
}					
posted @   DAGGGGGGGGGGGG  阅读(123)  评论(0编辑  收藏  举报
编辑推荐:
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ASP.NET Core 模型验证消息的本地化新姿势
· 对象命名为何需要避免'-er'和'-or'后缀
· SQL Server如何跟踪自动统计信息更新?
阅读排行:
· “你见过凌晨四点的洛杉矶吗?”--《我们为什么要睡觉》
· C# 从零开始使用Layui.Wpf库开发WPF客户端
· 编程神器Trae:当我用上后,才知道自己的创造力被低估了多少
· C#/.NET/.NET Core技术前沿周刊 | 第 31 期(2025年3.17-3.23)
· 接口重试的7种常用方案!
点击右上角即可分享
微信分享提示