Codeforces Round 893 (Div2) ProblemC

题目链接Problem - 1858C - Codeforces

比赛Dashboard - Codeforces Round 893 (Div. 2) - Codeforces

相信这条一定使大多数初学者难堪,但是不要害怕,我来拯救你们!

这题首先我们要明确目标,如果1-n你的数字是1,2,4,8,10...... 这种的话,你就会发现他的分数在逐渐上升,1和2是1,2和4是2,4和8是4,相信我举了这几个例子,你已经知道这题应该要怎么写了。

这条其实我个人感觉就是运用了类似埃氏筛的一个原理(如果你是数学和代码大佬,你可以用一下欧拉筛),我们先暂时不管1,把1放在第一位。从2开始,每个都乘2,例如2,4,6,8........ 这种,每次筛选我们都能把有因子2的数给筛选出来。然后从3再开始,3,6,9,12........ ,但是我们发现6这个数字同时有2和3这个因子,如果按照我刚刚说的来输出,6这个数字肯定会被输出两次,那这样肯定会wa的,所以我们要做的就是,已经出现的数字就不要让他出现第二遍了。

接下来是代码实现

#include <iostream>
#include <cstring>
#include <vector>
#define int long long
#define ll long long
#define endl '\n'
using namespace std;
int t;//放在外面减少运行时间
void solve()
{
    int n;
    cin>>n;
    vector<int> a(n+1);//动态数组比定义在外面的一个大数组运行时间大大减少
    a.clear();//每次循环清空数组,防止出现不必要的错误
    cout<<"1"<<' ';//像我说的先输出1,不知道建议看下埃氏筛原理
    a[1]=1;
    for(int i = 2;i<=n;i++)
    {
        int tmp = i;//从2开始找有因子2的数,以此类推
        while(tmp<=n)//防止找的tmp超出范围n
        {
            if(!a[tmp]) cout<<tmp<<' ';
            a[tmp]=1;//防止重复出现
            tmp*=2;
        }
    }
    cout<<'\n';
}
signed main(void)
{
    std::ios::sync_with_stdio(false);//关闭输入流
    cin.tie(0);//关闭输入流
    cout.tie(0);//关闭输入流
    cin>>t;
    while(t--)
    {
        solve();
    }
    return 0;
}

文章最后,我想说我把我自己在知乎上的文章转载了,我的知乎是字正腔圆,这样应该还是我自己原创

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

算法好玩头秃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值