P2312 [NOIP2014 提高组] 解方程

>>>>加减乘除运算都要时间

>>>>qjs  ()*x + )  ............

std::cout 会把输出放到一个叫缓冲区(stream buffer) 里,

直到缓冲区满了才会清空缓冲区并把字串输出到 stdout 之类的输出流,

这也就是为什么关闭了缓冲区可能会出现错误. 那么说到这里也就整明白了,

如果频繁使用 std::endl 来做换行输出, 那便是破坏了 std::cout 本身的类似于优化的操作,

也就导致了通常认为 std::cout 的速度比 printf慢.

》》》换行以后全部用 printf("\n"); to avoid mistake

/*
1 10
5
-1

1
5
*/ 
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<bits/stdc++.h>
#define ll long long
#define ddd printf("-----------------debug\n");
using namespace std;
const ll p=1000000007;

ll n,m,a[111],ans[1000007],num;

ll read()//ai≤1010000
{
    ll flag=1,sum=0; char ch=getchar();//!!!!!!!!!!!!!!!!!!!
    while(ch>'9'||ch<'0')
    {
        if(ch=='-') flag=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9')
    {
        sum=(sum*10+ch-'0')%p;
        ch=getchar();
    }
    return flag*sum;
}
void print(ll x)
{
    if(x<0){ putchar('-'); x=-x;}
   // if(x==0) return;
    if(x>9) print(x/10);
    putchar(x%10+'0');
}
/*
ll read()//读入优化(似乎不加会T两个点w) 
{
    ll sum=0,fg=1;
    char c=getchar();
    while(c < '0' || c > '9')
    {
        if(c=='-') fg=-1;//如果读到负号则记录 
        c=getchar();
    }
    while(c >='0' && c <='9')
    {
        sum=((sum*10)+c-'0')%p;
        //注意因为A[]可能很大,所以读入时就要进行取模操作 
        c=getchar();
    }
    return sum*fg;
    //如果是负数(fg==-1,即读到了负号)那么返回的值为负数 
}

ll calc(ll x)
{
    ll sum=0;//一定要清零!!!(不然只有10分呜呜呜) 
    for(ll i=n;i>=1;i--)
    {
        sum=((A[i]+sum)*x)%p;
        //这里套用秦九韶算法求多项式的值 注意A[0]并不需要乘x!
    }
    sum=(sum+A[0])%p;//这里再算上A[0]
    return sum==0? 1:0;//如果答案是0说明x值为该多项式的解,返回1(true) 
}


void print(ll x)//输出优化(这个可以不加qwq) 
{
    if(x<0)
    {
        putchar('-');
        x=-x;
    }
    if(x>9)//or 0-
    {
        print(x/10);
    }
    putchar(x%10+'0');
}
*/
ll cal(ll x)
{
    ll sum=0;
    for(ll i=n;i>=1;i--)
    {
        sum=( (sum+a[i])*x)%p;
    }
    sum=(sum+a[0])%p;
    return sum==0? 1: 0; 
}
int main()
{
    ios::sync_with_stdio(false);
    n=read(); m=read();
//    cout<<n<<m;
    for(ll i=0;i<=n;i++) a[i]=read();
    //for(ll i=0;i<=n;i++) cout<<a[i]<<endl;
    
    ll tmp=0;
    for(ll i=1;i<=m;i++)
    {
        if(cal(i))
        {
            tmp=1;
            ans[++num]=i;
        }
    }
    if(tmp==0) { cout<<"0"; printf("\n"); return 0;}
    print(num);  printf("\n");
    for(ll i=1;i<=num;i++) { print(ans[i]); printf("\n");}
    //cout<<endl;
    return 0;
}
View Code
 

 

 
posted @ 2023-07-20 18:26  JMXZ  阅读(7)  评论(0)    收藏  举报