zhangjinxuan 发表于 2023-3-25 11:30:12

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

本帖最后由 zhangjinxuan 于 2023-3-25 16:49 编辑



上一关:九连环

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

题目描述

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

输入格式
两个数字 n, m

输出格式

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

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

输出的内容就是:

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

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

输入样例1
9 6
输出样例1
2^3*3^2*7
输入样例2
10 5
输出样例2
2^5*3^3*5*7

数据范围

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

static/image/hrline/1.gif

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

答案与解析
**** Hidden Message *****

最佳战士排行榜

|第一名|第二名|第三名
名字|||
链接|||
语言|||
代码得分|||
奖励|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. 因为额度原因,部分鱼油可能下一天才能奖励。

static/image/hrline/1.gif

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

创作不易,如果你喜欢,别忘了评分、顶{:10_281:}


本关满意度调查

sfqxx 发表于 2023-3-25 12:53:47

看看

sfqxx 发表于 2023-3-25 16:39:23

有bug#include <bits/stdc++.h>
using namespace std;

const int N = 10000000;
int n, m;
bool prime;
int tot, c, frac, lastnum;
// c means i-th prime
// prime is prime if prime equal to 0
// frac means have how i.
// lastnum means last prime.

void init() {
      prime = 1;
      for (int i = 2; i <= N; ++i) {
                if (!prime) {
                        c[++tot] = i;
                }
                for (int j = 1; j <= tot && c * i <= N; ++j) {
                        prime * i] = 1;
                        if (i % c == 0) break;
                }
      }
}

void solve(int i) {
      for (int j = 1; c * c <= i && j <= tot; ++j) {
                while (i % c == 0) {
                        ++frac];
                        i /= c;
                        lastnum = max(lastnum, c);
                }
      }
      if (i > 1) {
                ++frac;
                lastnum = max(lastnum, i);
      }
}

int main() {
      scanf("%d%d", &n, &m);
      init();
      scanf("%d", &n);            //应该是scanf,不是scanf_s
      for (int i = m + 1; i <= n; ++i) {
                solve(i);
      }
      for (int i = 1; i <= tot; ++i) {
                if (frac]) {
                        printf("%d", c);
                        if (frac] != 1) {
                              printf("^%d", frac]);
                        }
                        if (c != lastnum) {
                              printf("*");
                        } else {
                              break;
                        }
                }
      }
      return 0;
}

zhangjinxuan 发表于 2023-3-25 16:48:48

sfqxx 发表于 2023-3-25 16:39
有bug

scanf_s 是安全的读入,部分的C,C++编译器有,但洛谷似乎没有,感谢提出

sfqxx 发表于 2023-3-25 16:53:53

嘿嘿

jhq999 发表于 2023-3-26 08:03:27

本帖最后由 jhq999 于 2023-3-26 08:28 编辑

sfqxx 发表于 2023-3-25 16:53
嘿嘿

照葫芦画瓢弄了个3-3000000的,粗糙了点
#include <stdio.h>
int num,pnum,plen=1;
int fun(int n)
{
    if(num)
    {
      fun(num);
      fun(num);
    }
    else
    {
      pnum]+=1;
    }
    return 0;
}
int main ()
{
    int i=0,j,k=0,m,s=2;
    num=1;
    num=1;
    for(i=2,k=1;i<=3000000;i+=1)
    {
      if(0==num)
      {

          pnum=i;
          num=k;
          k+=1;
      }
      for(j=1;j<i&&pnum*i<=3000000;j+=1)
      {
            m=pnum*i;
            num=i;
            num=pnum;

            if(0==i%pnum)break;
      }
    }
    plen=k;
    for(i=3;i<=3000000;i+=1)fun(i);
    for(i=1;i<plen;i+=1)if(pnum)printf("%d^%d*",pnum,pnum);
    return 0;
}

sfqxx 发表于 2023-3-26 11:36:05

jhq999 发表于 2023-3-26 08:03
照葫芦画瓢弄了个3-3000000的,粗糙了点

WA

jhq999 发表于 2023-3-26 12:21:22

sfqxx 发表于 2023-3-26 11:36
WA

#include <stdio.h>
int num,pnum,plen=1;
int fun(int n)
{
    if(num)
    {
      fun(num);
      fun(num);
    }
    else
    {
      pnum]+=1;
    }
    return 0;
}
int main ()
{
    int i=0,j,k=0,n,m,s=2;
    num=1;
    num=1;
    for(i=2,k=1;i<=3000000;i+=1)
    {
      if(0==num)
      {

          pnum=i;
          num=k;
          k+=1;
      }
      for(j=1;j<i&&pnum*i<=3000000;j+=1)
      {
            m=pnum*i;
            num=i;
            num=pnum;

            if(0==i%pnum)break;
      }
    }
    plen=k;
    scanf("%d%d",&n,&m);
    for(i=m+1;i<=n;i+=1)fun(i);
    for(i=1,k=0;i<plen;i+=1)
    {
      if(pnum)
      {
            if(k)printf("*");
            k=1;
            if(pnum>1)printf("%d^%d",pnum,pnum);
            else printf("%d",pnum);

      }
    }
    return 0;
}

sfqxx 发表于 2023-3-26 12:22:40

jhq999 发表于 2023-3-26 12:21


AC

jhq999 发表于 2023-3-26 12:30:18

sfqxx 发表于 2023-3-26 12:22
AC

{:5_109:}
页: [1]
查看完整版本: 【C++板块提升计划】梦想护卫舰 第33期 阶乘 & 鱼CR1 F题题解【原创】