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 解方程的主要内容,如果未能解决你的问题,请参考以下文章