首页 > 其他 > 详细

P2312 解方程

时间:2018-11-05 22:20:37      阅读:168      评论:0      收藏:0      [点我收藏+]

传送门

  14 年 D2T3 ?

思路:

  暴力地从 1~m 枚举方程的解,不会T,爆 long long 后期望得分 50分。

  正解,也是暴力枚举答案,为了不爆 long long ,可以考虑在每次计算时模一个大质数(足够大),不会影响解的情况。

  为了优化方程,需将方程拆解(利用秦九韶公式)。

  最后统计下答案就行了。

Code:

暴力:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
#include<cstdlib>
#include<stack>
#include<vector>
#include<queue>
#include<deque>
#include<map>
#include<set>
using namespace std;
#define lck_max(a,b) ((a)>(b)?(a):(b))
#define lck_min(a,b) ((a)<(b)?(a):(b))
typedef long long LL;
const int maxn=1e6+7;
LL n,m,jl,ans,top,a[105],st[maxn];
inline LL read()
{
    LL kr=1,xs=0;
    char ls;
    ls=getchar();
    while(!isdigit(ls))
    {
        if(!(ls^45))
            kr=-1;
        ls=getchar();
    }
    while(isdigit(ls))
    {
        xs=(xs<<1)+(xs<<3)+(ls^48);
        ls=getchar();
    }
    return xs*kr;
}
inline void out(LL xs)
{
    if(!xs) {putchar(48); return;}
    if(xs<0) putchar(-),xs=-xs;
    int kr[57],ls=0;
    while(xs) kr[++ls]=xs%10,xs/=10;
    while(ls) putchar(kr[ls]+48),ls--;
}
int main()
{
    n=read();m=read();
    for(LL i=0;i<=n;i++) a[i]=read();
    for(LL j=1;j<=m;j++)
    {
        jl=1,ans=0;
        for(LL i=1;i<=n;i++)
        {
            jl*=j;
            ans+=a[i]*jl;
        }
        ans+=a[0];
        if(!ans) st[++top]=j;
    }
    out(top),putchar(\n);
    for(LL i=1;i<=top;i++)
        out(st[i]),putchar(\n);
return 0;
}

 优化:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
#include<cstdlib>
#include<stack>
#include<vector>
#include<queue>
#include<deque>
#include<map>
#include<set>
using namespace std;
#define lck_max(a,b) ((a)>(b)?(a):(b))
#define lck_min(a,b) ((a)<(b)?(a):(b))
typedef long long LL;
const int mod=998244353;
const int maxn=1e6+7;
LL n,m,top,a[105],st[maxn];
inline LL read()
{
    LL kr=1,xs=0;
    char ls;
    ls=getchar();
    while(!isdigit(ls))
    {
        if(!(ls^45))
            kr=-1;
        ls=getchar();
    }
    while(isdigit(ls))
    {
        xs=((xs<<1)+(xs<<3)+(ls^48))%mod;
        ls=getchar();
    }
    return xs*kr;
}
inline void out(LL xs)
{
    if(!xs) {putchar(48); return;}
    if(xs<0) putchar(-),xs=-xs;
    int kr[57],ls=0;
    while(xs) kr[++ls]=xs%10,xs/=10;
    while(ls) putchar(kr[ls]+48),ls--;
}
inline void work(LL las)
{
    LL res=0;
    for(LL i=n;i;i--) res=((res+a[i])*las)%mod;
    res+=a[0],res%=mod;
    if(!res) st[++top]=las;
}
int main()
{
    n=read();m=read();
    for(LL i=0;i<=n;i++) a[i]=read();
    for(LL j=1;j<=m;j++) work(j);
    out(top),putchar(\n);
    for(LL i=1;i<=top;i++) out(st[i]),putchar(\n);
return 0;
}

 

P2312 解方程

原文:https://www.cnblogs.com/lck-lck/p/9911892.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!