题目链接:点击打开链接

题意:

给定n个数。k个感叹号,常数S

以下给出这n个数。

目标:

随意给当中一些数变成阶乘。至多变k个。

再随意取一些数,使得这些数和恰好为S

问有多少方法。

思路:

三进制状压。中途查找。

  1. #include <stdio.h>
  2. #include <vector>
  3. #include <algorithm>
  4. #include <iostream>
  5. #include <cmath>
  6. #include <map>
  7. #include <string.h>
  8. #include <string>
  9. template <class T>
  10. inline bool rd(T &ret) {
  11. char c; int sgn;
  12. if (c = getchar(), c == EOF) return 0;
  13. while (c != '-' && (c<'0' || c>'9')) c = getchar();
  14. sgn = (c == '-') ? -1 : 1;
  15. ret = (c == '-') ? 0 : (c - '0');
  16. while (c = getchar(), c >= '0'&&c <= '9') ret = ret * 10 + (c - '0');
  17. ret *= sgn;
  18. return 1;
  19. }
  20. template <class T>
  21. inline void pt(T x) {
  22. if (x <0) {
  23. putchar('-');
  24. x = -x;
  25. }
  26. if (x>9) pt(x / 10);
  27. putchar(x % 10 + '0');
  28. }
  29. using namespace std;
  30. typedef long long ll;
  31. const double pi = acos(-1.);
  32. const double e = 2.718281828459;
  33. const ll ma = 1e8;
  34. const int N = 2005;
  35. int n, k;
  36. ll a[30], m;
  37. ll jie[1000], hehe;
  38. ll cal(ll x){
  39. if (x >= hehe)return -1;
  40. return jie[x];
  41. }
  42. ll re[30];
  43. map<ll, int>mp[2][30];
  44. ll b[30], d[30], top;
  45. ll y[30], t;
  46. ll san[30];
  47. void work(int x){
  48. for (int i = 0; i < san[top]; i++)
  49. {
  50. int cnt = 0;
  51. ll sum = 0;
  52. int tmp = i, id = 0;
  53. while (tmp){
  54. if ((tmp % 3) == 1){
  55. cnt++; sum += d[id];
  56. if (d[id] < 0){ sum = m + 1; break; }
  57. }
  58. else if ((tmp % 3) == 2){
  59. sum += b[id];
  60. }
  61. if (cnt >k || sum > m)break;
  62. tmp /= 3; id++;
  63. }
  64. if (cnt <= k && sum <= m)mp[x][cnt][sum]++;
  65. }
  66. }
  67. int main(){
  68. while (cin >> n){
  69. rd(k); rd(m);
  70. san[0] = 1; for (int i = 1; i < 30; i++)san[i] = san[i - 1] * 3;
  71. jie[1] = 1;
  72. for (int i = 2;; i++){
  73. jie[i] = jie[i - 1] * i;
  74. if (m / jie[i] <= i){
  75. hehe = i + 1; break;
  76. }
  77. }
  78. for (int i = 0; i < n; i++){
  79. rd(a[i]);
  80. re[i] = cal(a[i]);
  81. }
  82. for (int i = 0; i < n / 2; i++){ b[i] = a[i]; d[i] = re[i]; }
  83. top = n / 2;
  84. work(0);
  85.  
  86. for (int i = n / 2; i < n; i++){ b[i - n / 2] = a[i]; d[i - n / 2] = re[i]; }
  87. top = n - n / 2;
  88. work(1);
  89. ll ans = 0;
  90. for (int i = 0; i <= k; i++)
  91. for (auto it : mp[0][i])
  92. for (int j = 0; j + i <= k; j++)
  93. if (mp[1][j].count(m - it.first))
  94. ans += (ll)it.second * mp[1][j][m - it.first];
  95. pt(ans);
  96. }
  97. return 0;
  98. }

Codeforces 525E Anya and Cubes 中途相遇法的更多相关文章

  1. Codeforces 525E Anya and Cubes

    http://codeforces.com/contest/525/problem/E 题意: 有n个方块,上面写着一些自然数,还有k个感叹号可用.k<=n 你可以选任意个方块,然后选一些贴上感 ...

  2. Codeforces 1105E 最大独立集 状态DP 中途相遇法

    题意:你有一个字符串, 有两种操作,一种是改变字符串,一种是某个用户询问这个字符串,如果一个用户每次查询字符串的时候都是他的用户名,他就会高兴.问最多有多少个用户会高兴? 题意:容易发现,在两个1操作 ...

  3. 【中途相遇法】【STL】BAPC2014 K Key to Knowledge (Codeforces GYM 100526)

    题目链接: http://codeforces.com/gym/100526 http://acm.hunnu.edu.cn/online/?action=problem&type=show& ...

  4. uva 6757 Cup of Cowards(中途相遇法,貌似)

    uva 6757 Cup of CowardsCup of Cowards (CoC) is a role playing game that has 5 different characters (M ...

  5. LA 2965 Jurassic Remains (中途相遇法)

    Jurassic Remains Paleontologists in Siberia have recently found a number of fragments of Jurassic pe ...

  6. HDU 5936 Difference 【中途相遇法】(2016年中国大学生程序设计竞赛(杭州))

    Difference Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total ...

  7. 高效算法——J 中途相遇法,求和

    ---恢复内容开始--- J - 中途相遇法 Time Limit:9000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Su ...

  8. 【UVALive】2965 Jurassic Remains(中途相遇法)

    题目 传送门:QWQ 分析 太喵了~~~~~ 还有中途相遇法这种东西的. 嗯 以后可以优化一些暴力 详情左转蓝书P58 (但可能我OI生涯中都遇不到正解是这个的题把...... 代码 #include ...

  9. uva1152 - 4 Values whose Sum is 0(枚举,中途相遇法)

    用中途相遇法的思想来解题.分别枚举两边,和直接暴力枚举四个数组比可以降低时间复杂度. 这里用到一个很实用的技巧: 求长度为n的有序数组a中的数k的个数num? num=upper_bound(a,a+ ...

随机推荐

  1. sdut1269 走迷宫(dfs)

    http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=1269 连着做了三个基本的dfs,终于弄懂了搜索 ...

  2. 可持久化Treap(fhq Treap,非旋转式Treap)学习(未完待续)

    简介:     Treap,一种表现优异的BST 优势:     其较于AVL.红黑树实现简单,浅显易懂     较于Splay常数小,通常用于树套BST表现远远优于Splay     或许有人想说S ...

  3. Cookie、Token与Session介绍(非原创)

    文章大纲 一.Cookie介绍二.Token介绍三.Session介绍四.Token.Cookie与Session比较五.参考文章   一.Cookie介绍 1. Cookie是什么 cookie机制 ...

  4. [Luogu 2216] [HAOI2007]理想的正方形

    [Luogu 2216] [HAOI2007]理想的正方形 题目描述 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 输入输出格式 输 ...

  5. mysql数据库的介绍及安装

    一.什么是数据库 1.什么是数据(Data) 描述事物的符号记录成为数据,描述事物的符号既可以是文字.图片.图像.声音.语言等,数据有多种表现形式,他们都可以经过数字化后存入计算机 在计算机中描述一个 ...

  6. C - Between the Offices

    Problem description As you may know, MemSQL has American offices in both San Francisco and Seattle. ...

  7. MySql c#通用类 转

    using System;using System.Data;using System.Configuration;using System.Collections.Generic;using Sys ...

  8. POI合并单元边框问题解决方法

    http://blog.csdn.net/hardworking0323/article/details/51105430

  9. 出现“ORA-28000:the account is locked”的解决办法

    在Oracle 11g版本中,出于安全的考虑,所有Oracle的默认用户,包括SCOTT用户都被锁定.输入用户名和口令之后,会出现错误“ORA-28000:the account is locked” ...

  10. halcon 模板匹配 -- 转化 vector_angle_to_rigid

    ********************************模板匹配 ********************create_shape_model创建模板,这个函数有许多参数,其中金字塔的级数由N ...