NOIP1998普及组解题报告
三连击
分析:模拟大水题。打表也行。注意输出顺序即可。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<iostream> #include<algorithm> #include<cstring> using namespace std; const int maxn=10; bool book[maxn]; int main(){ for(int i=1;i<=9;++i){ for(int j=1;j<=9;++j){ for(int k=1;k<=9;++k){ if(i!=j&&i!=k&&j!=k){ memset(book,0,sizeof(book)); book[i]=1; book[j]=1; book[k]=1; int t=i*100+j*10+k; int t1=t*2; int t2=t*3; int s=0; while(t1>0){ book[t1%10]=1; t1/=10; ++s; } if(s>3)break; s=0; while(t2>0){ book[t2%10]=1; t2/=10; ++s; } if(s>3)break; bool flag=1; for(int i=1;i<=9;++i)if(book[i]==0)flag=0; if(flag){ cout<<t<<" "<<t*2<<" "<<t*3<<endl; } } } } } return 0; }
阶乘之和
分析:高精度加法+高精度乘法(1个大数),模版体0 0
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<iostream> #include<algorithm> #include<cstring> using namespace std; const int maxn=1010; int ans[maxn],len=0,t[maxn],l=0; void sub(int s){ for(int i=0;i<=l;++i){ t[i]*=s; } for(int i=0;i<=l;++i){ t[i+1]+=t[i]/10; t[i]%=10; if(i==l&&t[i+1]!=0)++l; } } void add(){ for(int i=0;i<=max(l,len);++i){ ans[i]+=t[i]; } for(int i=0;i<=max(l,len);++i){ ans[i+1]+=ans[i]/10; ans[i]%=10; } len=max(l,len); if(ans[max(l,len)+1]>0)len++; } int main(){ int n; cin>>n; for(int i=1;i<=n;++i){ memset(t,0,sizeof(t)); t[0]=1; for(int j=1;j<=i;++j){ sub(j); } add(); } for(int i=len;i>=0;--i)cout<<ans[i]; return 0; }
幂次方
分析:计算机里的数就是二进制的,例如 7 =(B)111,模拟依次先处理最高位,得到的指数再传进参数递归。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<iostream> #include<algorithm> #include<cmath> #include<cstring> using namespace std; void f(int n){ int m=n; bool flag=0; while(n>0){ int t=0; while(n>0){ n/=2; ++t; } if(t==0)return ; if(t==1){ if(flag)cout<<"+";flag=1; cout<<"2(0)"; } else if(t==2){ if(flag)cout<<"+";flag=1; cout<<"2"; } else{ if(flag)cout<<"+";flag=1; cout<<"2(";f(t-1);cout<<")"; } n=m-pow(2,t-1); m=n; } } int main(){ int n; cin>>n; f(n); return 0; }
总结:noip1998的题除了第3题,其他就是一点思维难度都没有的题。模版不要打错,细节不要忽略即可。