Multiplying Digits Gym - 101490H

妖狐艹你老母 2022-06-08 04:28 204阅读 0赞

Think:
1知识点:map + 思维 + 剪枝
2题意:y为x在b进制下的各位数的乘积,输入b y,求满足的最小x
3方法:
(1):先得到y小于b的因子,然后在因子乘积等于y的约束下组合因子,得到最小的x

以下为Accepted代码

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long LL;
  4. const LL Inf = 0x7fffffffffffffff;
  5. LL tp, link[11400];
  6. map<LL, LL> mp;
  7. map<LL, LL> :: reverse_iterator it;
  8. int main(){
  9. LL b, n, tmp, i, u, v, x, y, mo;
  10. while(~scanf("%lld %lld", &b, &n)){
  11. if(n == 1){
  12. /*n = 1的特殊情况*/
  13. printf("1\n");
  14. continue;
  15. }
  16. tp = 0, tmp = n;
  17. for(i = 2; i < b; i++){
  18. if(n%i == 0) link[tp++] = i;
  19. while(tmp%i == 0){
  20. tmp /= i;
  21. }
  22. }
  23. if(tmp != 1) {
  24. printf("impossible\n");
  25. continue;
  26. }
  27. mp.clear();
  28. mp[n] = 0;
  29. for(it = mp.rbegin(); it != mp.rend(); it++){
  30. u = it->first, v = it->second;
  31. mo = v%b;
  32. for(i = tp-1; i>= 0; i--){
  33. if(link[i] < mo) break;/*最优解的组成为非严格递增,所以若后一位小于前一位,则一定不是整体最优解*/
  34. if(u%link[i]) continue;
  35. if((Inf-link[i])/b < v) continue;/*防止爆long long*/
  36. x = u/link[i], y = v*b + link[i];
  37. if((!mp[x]) || mp[x] > y) mp[x] = y;
  38. }
  39. }
  40. printf("%lld\n", mp[1]);
  41. }
  42. return 0;
  43. }

发表评论

表情:
评论列表 (有 0 条评论,204人围观)

还没有评论,来说两句吧...

相关阅读

    相关 gym224647B

    gym224647B 题意: > 在二维平面中·选出一个面积最小的三角形,输出这个三角形面积的两倍。 解法: > 首先,最优解一定在相邻最近的三个点...

    相关 Digits

    \\(Digits\\) ![m6C1AO.png][] 这道题目比较简单,首先先打出来暴力,然后一看\\(b\\)的范围,瞬间想到快速幂。 快速幂的精髓是什么?

    相关 GYM 100685 K

    乱搞题 统计每一个不是magic word的单词,然后每个make\_pair 然后按照公式计算答案。 因为这里是乱序的统计make\_pair的情况,所以如果相邻

    相关 Gym - 101201H

    ![70][] 题意:有k个区间,用他们填满1~n,不允许重叠,问留下的空隙最少是多少 思路:可以从两方面考虑,第一个是正面考虑,转移方程dp\[i\]=min(dp\[j