zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    Linux命令:sed命令
    Linux命令:grep命令 | egrep命令
    Linux命令:find命令
    bash脚本编程
    Linux命令:vi | vim命令
    Linux文件权限管理
    237. 删除链表中的节点
    160. 相交链表
    538. 把二叉搜索树转换为累加树
    543.Diameter of Binary Tree
  • 原文地址:https://www.cnblogs.com/lck-lck/p/9911892.html
Copyright © 2011-2022 走看看