LOJ 1109 - False Ordering (排序)

来源:互联网 发布:淘宝日系男装店铺排行 编辑:程序博客网 时间:2024/04/30 14:13
                                                                                                            1109 - False Ordering

   PDF (English)StatisticsForum
Time Limit: 1 second(s)Memory Limit: 32 MB

We define b is a Divisor of a number a if a is divisible by b. So, the divisors of 12 are 1, 2, 3, 4, 6, 12. So, 12 has 6 divisors.

Now you have to order all the integers from 1 to 1000. x will come before y if

1)                  number of divisors of x is less than number of divisors of y

2)                  number of divisors of x is equal to number of divisors of y and x > y.

Input

Input starts with an integer T (≤ 1005), denoting the number of test cases.

Each case contains an integer n (1 ≤ n ≤ 1000).

Output

For each case, print the case number and the nth number after ordering.

Sample Input

Output for Sample Input

5

1

2

3

4

1000

Case 1: 1

Case 2: 997

Case 3: 991

Case 4: 983

Case 5: 840

 题意:将1到1000的所有数按照他的因子个数从小到大排列,如果有相同的因子个数,则最大的那个数排在前面,然呢输出第n个数

思路:结构体排序加打表

#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>using namespace std;struct Node{int x,y;int ans;}node[1010];bool cmp(Node a,Node b){if(a.ans == b.ans)   return a.x > b.x;else   return a.ans < b.ans;}void dabiao(){for(int i = 1 ; i <= 1000 ; i++){node[i].x = i;node[i].y = i;}node[1].ans = 1;for(int i = 2 ; i <= 1000 ; i++){int k = sqrt(i);if(k * k == i)         node[i].ans--;for(int j = 1 ; j <= k; j++)    {      if(node[i].y % j == 0)         node[i].ans += 2;        } }}int main(){int t,kcase = 1;dabiao();sort(node+1,node+1001,cmp);int n;scanf("%d",&t);while(t--){scanf("%d",&n);    printf("Case %d: %d\n",kcase++,node[n].x);}return 0;}

0 0
原创粉丝点击