博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
False Ordering(统计因子个数、素因子分解)
阅读量:5941 次
发布时间:2019-06-19

本文共 2378 字,大约阅读时间需要 7 分钟。

False Ordering
Time Limit:1000MS     
Memory Limit:32768KB     
64bit IO Format:%lld & %llu
     

Description

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

5

1

2

3

4

1000

Sample Output

Case 1: 1

Case 2: 997

Case 3: 991

Case 4: 983

Case 5: 840

 统计一个整数n的因子个数的方法:将n进行素因子分解,n=(q1^r1)*(q2^r2)*...*(qi^ri),则n的因子数为(r1+1)*(r2+1)*...*(ri+1).

因为对于每个q,其对应的指数为r,q可取0个,1个,...,r-1个。

AC Code:

1 #include 
2 #include
3 #include
4 #include
5 using namespace std; 6 7 int dr[1001], num[1001]; //dr[i]是i的因子个数,num[i] = i 8 int d[500], di = 0; 9 bool p[1001];10 11 bool cmp(const int& a, const int& b)12 {13 if(dr[a] != dr[b]) return dr[a] < dr[b];14 return a > b;15 }16 17 void Init_Prime()18 {19 memset(p, 0, sizeof(p));20 p[1] = 1;21 for(int i = 2; i < 1001; i++)22 {23 if(!p[i])24 {25 d[di++] = i;26 for(int j = 2; j * i < 1001; j++)27 p[i*j] = 1;28 }29 }30 //for(int i = 0; i < di; i++) cout << d[i] << ' ';31 return ;32 }33 34 void Cal(int x)35 {36 int t = x;37 int sum = 1, cnt;38 for(int i = 0; d[i] <= t / 2 && i < di; i++)39 {40 cnt = 0;41 while(x % d[i] == 0)42 {43 cnt++;44 x /= d[i];45 }46 sum *= (cnt + 1);47 }48 if(!p[t]) sum *= 2;49 dr[t] = sum;50 return ;51 }52 53 int main()54 {55 int t, n, ca = 1;56 scanf("%d", &t);57 Init_Prime();58 for(int i = 1; i < 1001; i++)59 {60 num[i] = i;61 Cal(i);62 }63 //for(int i = 1; i < 30; i++) cout << i << ' ' << dr[i] << endl;64 sort(num + 1, num + 1001, cmp);65 while(t--)66 {67 scanf("%d", &n);68 printf("Case %d: %d\n", ca++, num[n]);69 }70 return 0;71 }

 

转载地址:http://akmtx.baihongyu.com/

你可能感兴趣的文章
Mycat源码中的单例模式
查看>>
WPF Dispatcher介绍
查看>>
fiddler展示serverIP方法
查看>>
C语言中的随意跳转
查看>>
WPF中如何将ListViewItem双击事件绑定到Command
查看>>
《聚散两依依》
查看>>
小tips:你不知道的 npm init
查看>>
Mac笔记本中是用Idea开发工具在Java项目中调用python脚本遇到的环境变量问题解决...
查看>>
Jmeter也能IP欺骗!
查看>>
Rust 阴阳谜题,及纯基于代码的分析与化简
查看>>
ASP.NET Core的身份认证框架IdentityServer4(4)- 支持的规范
查看>>
(原創) array可以使用reference方式傳進function嗎? (C/C++)
查看>>
170多个Ionic Framework学习资源(转载)
查看>>
Azure:不能把同一个certificate同时用于Azure Management和RDP
查看>>
Directx11教程(15) D3D11管线(4)
查看>>
Microsoft Excel软件打开文件出现文件的格式与文件扩展名指定格式不一致?
查看>>
ios ble 参考
查看>>
linux中注册系统服务—service命令的原理通俗
查看>>
基于托管C++的增删改查及异步回调小程序
查看>>
Oracle DBMS_STATS 包 和 Analyze 命令的区别
查看>>