本题是求大于L的能整出(P-L)的树的罗列。(从大到小。)
这道题如果用单一顺序列举肯定会慢,因为数字越大,因数分布越稀,能得到因数的几率越小。
所以我的代码会TLE。 - -||
我的TLE代码。
- //大于L的能整除(P-L)的数的罗列 //TLE
- #include <stdio.h>
- int main()
- {
- int T,t;
- int p,l,a,i;
- scanf("%d",&T);
- for(t=1;t<=T;t++)
- {
- scanf("%d%d",&p,&l);
- if(l*2>=p)
- printf("Case %d: impossible\n",t);
- else
- {
- printf("Case %d: ",t);
- a=p-l;
- for(i=l+1;i<=a/2;i++)
- if(a%i==0)
- printf("%d ",i);
- printf("%d\n",a);
- }
- }
- return 0;
- }
能解决问题的代码。(善用C++容器。)
- #include <cstdio>
- #include <algorithm>
- #include <vector>
- #include <cmath>
- using namespace std;
- int main() {
- int test, cs, p, l, n, sz, rt;
- vector< int > V;
- scanf("%d", &test);
- for(cs = 1; cs <= test; cs++) {
- scanf("%d %d", &p, &l); n = p - l; rt = (int)sqrt(n);
- V.clear();
- for(p = 1; p <= rt; p++) {
- if(n % p == 0) {
- if(p > l) V.push_back(p);
- if(p * p != n) {
- if(n / p > l) V.push_back(n / p);
- }
- }
- }
- if(V.empty()) printf("Case %d: impossible\n", cs);
- else {
- sort(V.begin(), V.end()); sz = V.size();
- printf("Case %d:", cs);
- for(p = 0; p < sz; p++) printf(" %d", V[p]);
- printf("\n");
- }
- }
- return 0;
- }
阅读(423) | 评论(0) | 转发(0) |