P2312 解方程

Posted lck-lck

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P2312 解方程相关的知识,希望对你有一定的参考价值。

传送门

  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(
);
    for(LL i=1;i<=top;i++)
        out(st[i]),putchar(
);
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(
);
    for(LL i=1;i<=top;i++) out(st[i]),putchar(
);
return 0;
}

 

以上是关于P2312 解方程的主要内容,如果未能解决你的问题,请参考以下文章

NOIP2014/洛谷P2312 解方程

[noip2014]P2312 解方程

P2312 解方程

洛谷 P2312 解方程

luogu P2312 解方程

[NOIP2014] 提高组 洛谷P2312 解方程