标签:
原题链接:http://acm.hunnu.edu.cn/online/?action=problem&type=show&id=11658&courseid=0
刚开始想到“暴力”,后来发现int只能保存到12!,而__int64也只能到保存到20多的阶乘,
后来发现,两个阶乘相除约分后为几个连续自然数相乘的形式,后来还是TLE,最后发现,只有1是Impossible
其他的都可以找到。优化一下循环可以过。
还有一种方法,从sqrt(n)开始向前面枚举。
#include <iostream> #include <cstdio> using namespace std; int main() { int n; int kase=0; while(cin>>n) { printf("Case %d: ",++kase); if(n==1) { cout<<"Impossible"<<endl; continue; } int x,y; bool flag=true; for(int i=1;flag&&i*i<=n;i++) { int ans=i; for(int j=i+1;flag;j++) { if(j-i>13) break; ans*=j; if(ans==n) { x=i; y=j; flag=false; } if(ans>n) break; } } if(flag) { cout<<n<<" "<<n-1<<endl; continue; } if(x!=1) x-=1; cout<<y<<" "<<x<<endl; } return 0; }AC代码2:
#include <cstdio> #include <iostream> #include <cmath> using namespace std; int main() { int n; int kase=0; //120 210 //1*2*3*4*5==120 //5*6*7==210 while(cin>>n) { bool flag=true; int x,y; printf("Case %d: ",++kase); if(n==1) { cout<<"Impossible"<<endl; continue; } int sq=int(sqrt(n)); for(int i=1; flag&&i<=sq+1; i++) { int ans=1; for(int j=i; flag&&j>=0; j--) { ans*=j; if(ans==n) { cout<<i<<" "<<j-1<<endl; flag=false; } if(ans>n) { break; } } } if(flag) cout<<n<<" "<<n-1<<endl; } return 0; }
HNNU 11658 阶乘除法【湖南省第十一届大学生计算机程序设计竞赛,数论】
标签:
原文地址:http://blog.csdn.net/hurmishine/article/details/52292263