多校第八场
HDU 4950 Monster
小模拟题。找到推断的临界条件。
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; __int64 h,a,b,k,sum; int main() { int i=0; while(scanf("%I64d%I64d%I64d%I64d",&h,&a,&b,&k)&&(a+b+h+k)) { i++; bool flag=0; sum=h; if(a>=h) flag=1; if(sum-k*a+(k-1)*b<1) flag=1; if(a*k-b*(k+1)>0) flag=1; if(flag==1)cout<<"Case #"<<i<<": YES"<<endl; else cout<<"Case #"<<i<<": NO"<<endl; } return 0; }
HDU 4952 Number Transformation
这个题的数据量是比較大的,要是直接暴搞的话肯定是会T的。可是打表之后就发现了规律;
#include<iostream> #include<cstdio> using namespace std; __int64 x,k; int main() { int i=0; while(scanf("%I64d%I64d",&x,&k)&&(x+k)) { __int64 y; int t=0; for(int i=2;i<=k;i++) { if(x%i) { if(t>100) break; y=x/i; y++; x=y*i; y=x/i; t++; cout<<i<<" "<<y<<" "<<x<<endl; } } } return 0; }
发现到x/(i+1)小于i+1之后。x/(i+1)的值是不会变化的;
事实上官方是有公式证明的;
以下是代码。
#include<iostream> #include<cstdio> using namespace std; __int64 x,k; int main() { int j=0; while(scanf("%I64d%I64d",&x,&k)&&(x+k)) { __int64 y; j++; bool flag=0; for(int i=2; i<=k; i++) { if(x%i) { y=x/i; y++; x=y*i; y=x/i; if(y<i) { flag=1; break; } } } if(flag==1) printf("Case #%d: %I64d\n",j,y*k); else printf("Case #%d: %I64d\n",j,x); } return 0; }