鱼C论坛

 找回密码
 立即注册
查看: 1268|回复: 9

[已解决]【C++板块提升计划】梦想护卫舰 第33期 阶乘 & 鱼CR1 F题题解【原创】

[复制链接]
发表于 2023-3-25 11:30:12 | 显示全部楼层 |阅读模式
本帖最后由 zhangjinxuan 于 2023-3-25 16:49 编辑


上一关:九连环

梦想护卫舰 第33期 九连环 & 鱼CR1 F题题解


题目描述

给你两个数字 n 和 m,问 n!/m! 的质因数分解是多少 (保证 n > m)

输入格式
两个数字 n, m

输出格式

输出格式有点复杂,请让我慢慢道来

举个例子,因为 9!/6!=504

输出的内容就是:

  1. 2^3*3^2*7
复制代码

用另一种语言描述就是我们4设一个数有 m 个 n 个质因数,输出的内容必须包含 n ^ m,如果 m=1,直接输出 n,且 m 不可以等于 0

最后,要注意没有空格,所有质因数也要从小到大排序

输入样例1
  1. 9 6
复制代码

输出样例1
  1. 2^3*3^2*7
复制代码

输入样例2
  1. 10 5
复制代码

输出样例2
  1. 2^5*3^3*5*7
复制代码


数据范围

对于 100% 的数据,保证 1<=m<n<=3*10^6


                               
登录/注册后可看大图


注:本题原创,链接:https://www.luogu.com.cn/problem/U287191

答案与解析
游客,如果您要查看本帖隐藏内容请回复
[/hide]

最佳战士排行榜
第一名第二名第三名
名字
链接
语言
代码得分
奖励5鱼币5荣誉+“最佳答案”3鱼币3荣誉2鱼币2荣誉


我们一起来 Hack

Hack 规则
1. Hack 经证实均有奖励,你在 Hack 时得提供完整证据、证明;
2. 在本关,支持题面 hack,标程 hack,细节问题奖励 1~5 鱼币,重点问题奖励 5~10 鱼币
3. 奖励上限为 3


名字sfqxx
Hack 类型标程hack(环境差异)
是否证实
奖励2鱼币


答题/奖励规则
1. 不能抄袭,否则无奖励,可能还会扣分;
2. 当您遇到问题时,您可以回贴提问,我会为您解答
3. 提供完整能得分的题解,均有奖励
4. 因为额度原因,部分鱼油可能下一天才能奖励。


                               
登录/注册后可看大图


想查看更多精彩内容,请访问 本专辑

创作不易,如果你喜欢,别忘了分、顶


本关满意度调查
最佳答案
2023-3-26 08:03:27
本帖最后由 jhq999 于 2023-3-26 08:28 编辑


照葫芦画瓢弄了个3-3000000的,粗糙了点
  1. #include <stdio.h>
  2. int num[3000001][2],pnum[3000001][2],plen=1;
  3. int fun(int n)
  4. {
  5.     if(num[n][0])
  6.     {
  7.         fun(num[n][0]);
  8.         fun(num[n][1]);
  9.     }
  10.     else
  11.     {
  12.         pnum[num[n][1]][1]+=1;
  13.     }
  14.     return 0;
  15. }
  16. int main ()
  17. {
  18.     int i=0,j,k=0,m,s=2;
  19.     num[1][0]=1;
  20.     num[1][1]=1;
  21.     for(i=2,k=1;i<=3000000;i+=1)
  22.     {
  23.       if(0==num[i][0])
  24.       {

  25.           pnum[k][0]=i;
  26.           num[i][1]=k;
  27.           k+=1;
  28.       }
  29.         for(j=1;j<i&&pnum[j][0]*i<=3000000;j+=1)
  30.         {
  31.             m=pnum[j][0]*i;
  32.             num[m][0]=i;
  33.             num[m][1]=pnum[j][0];

  34.             if(0==i%pnum[j][0])break;
  35.         }
  36.     }
  37.     plen=k;
  38.     for(i=3;i<=3000000;i+=1)fun(i);
  39.     for(i=1;i<plen;i+=1)if(pnum[i][1])printf("%d^%d*",pnum[i][0],pnum[i][1]);
  40.     return 0;
  41. }
复制代码
多选投票: ( 最多可选 6 项 ), 共有 2 人参与投票
您所在的用户组没有投票权限

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-3-25 12:53:47 | 显示全部楼层
看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-3-25 16:39:23 | 显示全部楼层
有bug
  1. #include <bits/stdc++.h>
  2. using namespace std;

  3. const int N = 10000000;
  4. int n, m;
  5. bool prime[N + 1];
  6. int tot, c[N + 1], frac[N + 1], lastnum;
  7. // c[i] means i-th prime
  8. // prime[i] is prime if prime[i] equal to 0
  9. // frac[i] means have how i.
  10. // lastnum means last prime.

  11. void init() {
  12.         prime[1] = 1;
  13.         for (int i = 2; i <= N; ++i) {
  14.                 if (!prime[i]) {
  15.                         c[++tot] = i;
  16.                 }
  17.                 for (int j = 1; j <= tot && c[j] * i <= N; ++j) {
  18.                         prime[c[j] * i] = 1;
  19.                         if (i % c[j] == 0) break;
  20.                 }
  21.         }
  22. }

  23. void solve(int i) {
  24.         for (int j = 1; c[j] * c[j] <= i && j <= tot; ++j) {
  25.                 while (i % c[j] == 0) {
  26.                         ++frac[c[j]];
  27.                         i /= c[j];
  28.                         lastnum = max(lastnum, c[j]);
  29.                 }
  30.         }
  31.         if (i > 1) {
  32.                 ++frac[i];
  33.                 lastnum = max(lastnum, i);
  34.         }
  35. }

  36. int main() {
  37.         scanf("%d%d", &n, &m);
  38.         init();
  39.         scanf("%d", &n);              //应该是scanf,不是scanf_s
  40.         for (int i = m + 1; i <= n; ++i) {
  41.                 solve(i);
  42.         }
  43.         for (int i = 1; i <= tot; ++i) {
  44.                 if (frac[c[i]]) {
  45.                         printf("%d", c[i]);
  46.                         if (frac[c[i]] != 1) {
  47.                                 printf("^%d", frac[c[i]]);
  48.                         }
  49.                         if (c[i] != lastnum) {
  50.                                 printf("*");
  51.                         } else {
  52.                                 break;
  53.                         }
  54.                 }
  55.         }
  56.         return 0;
  57. }
复制代码

评分

参与人数 2荣誉 +5 鱼币 +7 收起 理由
jhq999 + 5 + 5 学到了,希望自己别忘了^_^
zhangjinxuan + 2 无条件支持楼主!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-3-25 16:48:48 | 显示全部楼层

scanf_s 是安全的读入,部分的C,C++编译器有,但洛谷似乎没有,感谢提出
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-3-25 16:53:53 | 显示全部楼层
嘿嘿
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-3-26 08:03:27 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jhq999 于 2023-3-26 08:28 编辑


照葫芦画瓢弄了个3-3000000的,粗糙了点
  1. #include <stdio.h>
  2. int num[3000001][2],pnum[3000001][2],plen=1;
  3. int fun(int n)
  4. {
  5.     if(num[n][0])
  6.     {
  7.         fun(num[n][0]);
  8.         fun(num[n][1]);
  9.     }
  10.     else
  11.     {
  12.         pnum[num[n][1]][1]+=1;
  13.     }
  14.     return 0;
  15. }
  16. int main ()
  17. {
  18.     int i=0,j,k=0,m,s=2;
  19.     num[1][0]=1;
  20.     num[1][1]=1;
  21.     for(i=2,k=1;i<=3000000;i+=1)
  22.     {
  23.       if(0==num[i][0])
  24.       {

  25.           pnum[k][0]=i;
  26.           num[i][1]=k;
  27.           k+=1;
  28.       }
  29.         for(j=1;j<i&&pnum[j][0]*i<=3000000;j+=1)
  30.         {
  31.             m=pnum[j][0]*i;
  32.             num[m][0]=i;
  33.             num[m][1]=pnum[j][0];

  34.             if(0==i%pnum[j][0])break;
  35.         }
  36.     }
  37.     plen=k;
  38.     for(i=3;i<=3000000;i+=1)fun(i);
  39.     for(i=1;i<plen;i+=1)if(pnum[i][1])printf("%d^%d*",pnum[i][0],pnum[i][1]);
  40.     return 0;
  41. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-3-26 11:36:05 | 显示全部楼层
jhq999 发表于 2023-3-26 08:03
照葫芦画瓢弄了个3-3000000的,粗糙了点

WA
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-3-26 12:21:22 | 显示全部楼层
  1. #include <stdio.h>
  2. int num[3000001][2],pnum[3000001][2],plen=1;
  3. int fun(int n)
  4. {
  5.     if(num[n][0])
  6.     {
  7.         fun(num[n][0]);
  8.         fun(num[n][1]);
  9.     }
  10.     else
  11.     {
  12.         pnum[num[n][1]][1]+=1;
  13.     }
  14.     return 0;
  15. }
  16. int main ()
  17. {
  18.     int i=0,j,k=0,n,m,s=2;
  19.     num[1][0]=1;
  20.     num[1][1]=1;
  21.     for(i=2,k=1;i<=3000000;i+=1)
  22.     {
  23.       if(0==num[i][0])
  24.       {

  25.           pnum[k][0]=i;
  26.           num[i][1]=k;
  27.           k+=1;
  28.       }
  29.         for(j=1;j<i&&pnum[j][0]*i<=3000000;j+=1)
  30.         {
  31.             m=pnum[j][0]*i;
  32.             num[m][0]=i;
  33.             num[m][1]=pnum[j][0];

  34.             if(0==i%pnum[j][0])break;
  35.         }
  36.     }
  37.     plen=k;
  38.     scanf("%d%d",&n,&m);
  39.     for(i=m+1;i<=n;i+=1)fun(i);
  40.     for(i=1,k=0;i<plen;i+=1)
  41.     {
  42.         if(pnum[i][1])
  43.         {
  44.             if(k)printf("*");
  45.             k=1;
  46.             if(pnum[i][1]>1)printf("%d^%d",pnum[i][0],pnum[i][1]);
  47.             else printf("%d",pnum[i][0]);

  48.         }
  49.     }
  50.     return 0;
  51. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-3-26 12:22:40 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-3-26 12:30:18 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-25 02:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表