阶乘之和

描述

对于整数pp,给出以下定义

p=x_{1}!+x_{2}!+x_{3}!+...+x_{q}!(x_{i}<x_{j}for\ all\ i<j )p=x1​!+x2​!+x3​!+...+xq​!(xi​<xj​for all i<j)且x_{i} \neq 0xi​≠0

((注释:p等于多个数的阶乘和,并且x_{1},x_{2},x_{3},...,x_{q}x1​,x2​,x3​,...,xq​为不相等的任意正整数,即组成p的阶乘不重复使用))

给定两个整数x,y,判断二者是否能满足以上定义。若二者都满足定义,设x由k_{1}k1​个数的阶乘和组成,y由k_{2}k2​个数的阶乘和组成,若k_{1}=k_{2}k1​=k2​,按下述输出格式输出二者的定义形式((输出时,阶乘按递增形式输出,例如:7=1!+3!))。

输入

第一行输入一个整数T,代表T组测试数据。(1\leq T \leq 10000)(1≤T≤10000)

接下来T行,每行包含两个整数x,y。(1\leq x,y \leq 10^{18})(1≤x,y≤1018)

输出

对于每组x,y输出包含两部分:

①如果二者都满足以上定义,输出“SEYES”;如果只有其一满足以上定义,输出“YNEOS”;如果二者都不满足以上定义,则输出“ONO”。

②当x,y都满足以上定义且k_{1}=k_{2}k1​=k2​时,输出二者的定义形式。否者输出“dWvWb”。

输入样例 1 

  1. 4
  2. 7 7
  3. 1 2
  4. 4 2
  5. 4 4

输出样例 1

  1. Case 1:SEYES
  2. 7=1!+3!
  3. 7=1!+3!
  4. Case 2:SEYES
  5. 1=1!
  6. 2=2!
  7. Case 3:YNEOS
  8. dWvWb
  9. Case 4:ONO
  10. dWvWb

一道水题。一开始受Codeup 1085这道题的影响,一直从正向考虑,导致没有准确的思路。然后用了dfs,果断超时,加了剪枝之后时间并没有降下来QAQ,最后看了一下别人提交的代码,好短的代码长度,好快的运行时间QAQ。果断放弃之前的思路,从逆向考虑,马虎了一次后第二次就过了。

没想到这个题能卡三个小时,WA6发,果然前期太猛后期就萎了

AC代码

  1. #include <bits/stdc++.h>
  2. #define ll long long
  3. #define ms(a) memset(a,0,sizeof(a));
  4. #define pi acos(-1.0)
  5. #define INF 0x3f3f3f3f
  6. using namespace std;
  7. const int maxn=1e6+10;
  8. const double E=exp(1);
  9. ll a[maxn];
  10. int b[maxn];
  11. int c[maxn];
  12. int vis[maxn];
  13. int vis1[maxn];
  14. int main(int argc, char const *argv[])
  15. {
  16. ios::sync_with_stdio(false);
  17. a[1]=1;
  18. // 打表记录阶乘
  19. for(int i=2;i<=20;i++)
  20. a[i]=a[i-1]*i;
  21. int t;
  22. int xx=0;
  23. cin>>t;
  24. ll x,y;
  25. while(t--)
  26. {
  27. cin>>x>>y;
  28. ll X=x;
  29. ll Y=y;
  30. int flag1=0,flag2=0;
  31. int o1=0;
  32. int o2=0;
  33. ms(vis);
  34. while(X)
  35. {
  36. for(int i=20;i>=1;i--)
  37. {
  38. if(X>=a[i])
  39. {
  40. b[o1++]=i;
  41. vis[i]++;
  42. }
  43. if(X==0)
  44. {
  45. flag1=1;
  46. break;
  47. }
  48. }
  49. }
  50. while(Y)
  51. {
  52. for(int i=20;i>=1;i--)
  53. {
  54. if(Y>=a[i])
  55. {
  56. vis1[i]++;
  57. c[o2++]=i;
  58. }
  59. if(Y==0)
  60. flag2=1;
  61. }
  62. }
  63. sort(b,b+o1);
  64. sort(c,c+o2);
  65. int O1=o1,O2=o2;
  66. // 去一下重吧,不知道为什么不去重会有重复元素
  67. o1=unique(b,b+o1)-b;
  68. o2=unique(c,c+o2)-c;
  69. if(o1!=O1)
  70. flag1=0;
  71. if(o2!=O2)
  72. flag2=0;
  73. cout<<"Case "<<++xx<<":";
  74. if(flag1+flag2==0)
  75. cout<<"ONO\n"<<"dWvWb"<<endl;
  76. if(flag1+flag2==2)
  77. {
  78. cout<<"SEYES"<<endl;
  79. if(o1!=o2)
  80. cout<<"dWvWb"<<endl;
  81. else
  82. {
  83. cout<<x<<"=";
  84. for(int i=0;i<o1;i++)
  85. {
  86. if(i)
  87. cout<<"+";
  88. cout<<b[i]<<"!";
  89. }
  90. cout<<endl;
  91. cout<<y<<"=";
  92. for(int i=0;i<o2;i++)
  93. {
  94. if(i)
  95. cout<<"+";
  96. cout<<c[i]<<"!";
  97. }
  98. cout<<endl;
  99. }
  100. }
  101. if(flag2+flag1==1)
  102. cout<<"YNEOS\n"<<"dWvWb"<<endl;
  103. }
  104. return 0;
  105. }

HPU 第三次积分赛:阶乘之和(水题)的更多相关文章

  1. HPU第三次积分赛-D:Longest Increasing Subsequence(DP)

    Longest Increasing Subsequence 描述 给出一组长度为n的序列,a1​,a2​,a3​,a4​...an​, 求出这个序列长度为k的严格递增子序列的个数 输入 第一行输入T ...

  2. CCF 201512-1 数位之和 (水题)

    问题描述 给定一个十进制整数n,输出n的各位数字之和. 输入格式 输入一个整数n. 输出格式 输出一个整数,表示答案. 样例输入 20151220 样例输出 13 样例说明 20151220的各位数字 ...

  3. nyoj 91 阶乘之和

    点击打开链接 阶乘之和 时间限制:3000 ms  |  内存限制:65535 KB 难度: 描述 给你一个非负数整数n,判断n是不是一些数(这些数不允许重复使用,且为正数)的阶乘之和,如9=1!+2 ...

  4. nyoj 91 阶乘之和(贪心)

    阶乘之和 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 给你一个非负数整数n,判断n是不是一些数(这些数不允许重复使用,且为正数)的阶乘之和,如9=1!+2!+3! ...

  5. ytu 1061: 从三个数中找出最大的数(水题,模板函数练习 + 宏定义练习)

    1061: 从三个数中找出最大的数 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 154  Solved: 124[Submit][Status][We ...

  6. ytu 1064: 输入三个字符串,按由小到大的顺序输出(水题,字符串处理)

    1064: 输入三个字符串,按由小到大的顺序输出 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 471  Solved: 188[Submit][Sta ...

  7. ACM 阶乘之和

    阶乘之和 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 给你一个非负数整数n,判断n是不是一些数(这些数不允许重复使用,且为正数)的阶乘之和,如9=1!+2!+3! ...

  8. 阶乘之和--nyoj91

    描述 给你一个非负数整数n,判断n是不是一些数(这些数不允许重复使用,且为正数)的阶乘之和,如9=1!+2!+3!,如果是,则输出Yes,否则输出No: 输入 第一行有一个整数0<m<10 ...

  9. AC日记——阶乘之和 洛谷 P1009(高精度)

    题目描述 用高精度计算出S=1!+2!+3!+…+n!(n≤50) 其中“!”表示阶乘,例如:5!=5*4*3*2*1. 输入输出格式 输入格式: 一个正整数N. 输出格式: 一个正整数S,表示计算结 ...

随机推荐

  1. Lua中模块初识

    定义了两个文件: Module.lua 和 main.lua 其中,模块的概念,使得Lua工程有了程序主入口的概念,其中main.lua就是用来充当程序主入口的. 工程截图如下: Module.lua ...

  2. ASP.NET调用dos命令获取交换机流量

    protected void btn_Cisco_Click(object sender, EventArgs e) { try { string ip = txt_ip.Value; string ...

  3. 女生学java是否真的没有优势

    随着女性越来越独立,我们可以看到再以前我们认为不适合女性朋友从事的工作,也出现了越来越多的女生,例如对IT行业也不再跟之前一样畏惧.虽然当下很多人所持的观点依旧是,女生不适合IT行业,但是很多女生已经 ...

  4. Android之 RecyclerView,CardView 详解和相对应的上拉刷新下拉加载

    随着 Google 推出了全新的设计语言 Material Design,还迎来了新的 Android 支持库 v7,其中就包含了 Material Design 设计语言中关于 Card 卡片概念的 ...

  5. thinkphp条件查询

    1.这是我在做项目的时候编写的: $profit = M('shipping_types',' ','DB_PROFIT');//没有表前缀,在M函数的第二个参数就为空. //条件$field = a ...

  6. c++中的new和delete

    对于计算机程序设计而言,变量和对象在内存中的分配都是编译器在编译程序时安排好的,这带来了极大的不便,如数组必须大开小用,指针必须指向一个已经存在的变量或对象.对于不能确定需要占用多少内存的情况,动态内 ...

  7. memcpy详解

    头文件:#include<string.h>函数原型:void *memcpy(void str,const void *s,size_t n); 功能 c和c++使用的内存拷贝函数.从源 ...

  8. Erlang:Error in process ... with exit value

    =ERROR REPORT==== 10-Apr-2015::16:30:04 ===Error in process <0.218.0> with exit value: {badarg ...

  9. OC MRC之计数器的基本操作(代码分析)

    /* 1.方法的基本使用 1> retain :计数器+1,会返回对象本身 2> release :计数器-1,没有返回值 3> retainCount :获取当前的计数器 4> ...

  10. TCP为什么是三次握手,为什么不是两次或者四次 && TCP四次挥手

    这是一个很有意思的问题~ 首先,我们要知道TCP是全双工的,即客户端在给服务器端发送信息的同时,服务器端也可以给客户端发送信息.而半双工的意思是A可以给B发,B也可以给A发,但是A在给B发的时候,B不 ...