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; }

浙公网安备 33010602011771号