zoukankan      html  css  js  c++  java
  • Codeforces 1091C New Year and the Sphere Transmission|数学

    题目链接

    题目大意:
    有$n$个人坐成一个环,其中第$i$人与第$i+1$人相邻(第$1$个人与第$n$个人相邻)。

    现在编号为1的人的手上有一个球,他可以选择一个数$k$($1 le k le n$)。表示每次手上有球的人把球传给后面的第$k$个人。当球重新回到编号为$1$的人时游戏结束。

    定义一次游戏的$fun$值为球传到的每个人的编号之和。请从小到大输出所有可能的$fun$值。


    首先,我们看$n$的范围,$n le 10^9$,显然模拟$n$次是不行的。我们要想办法优化。

    • 优化方案 A

    我们发现 ,$k=i$时与$k=n-i$时的$fun$值是相同的,所以我们可以缩成$n/2$次模拟,但对于这题来说,显然不够。

    • 优化方案 B

    请自行手玩$k=2$与$K=3$时的情况

    通过手玩,我们可以发现,如果$k$ $mod$ $n$不为0时,答案一定为$1+2+3+...+n$。也就是说,当$k$是$n$的约数时,才会有新答案。

    所以我们可以枚举约数,当$k$是$n$的约数时,我们才进行计算。通过这个方法,模拟次数大大减少。然而,还是会TLE。

    • 优化方案 C

    在B的基础上,我们再考虑从模拟下功夫优化。

    我们可以发现,经过的点的编号是一个等差数列。利用小学学过的公式,我们就可以快速求和。至此,成功通过此题。

    贴代码

    #include<bits/stdc++.h>
    using namespace std;
    long long n,ys[1000000],num;
    int main()
    {
        cin>>n;
        for (int i=int(sqrt(n));i>0;i--)
        {
            if (!(n%i)) 
            {
                ys[++num]=i;
                ys[++num]=n/i; 
            } 
        }//预处理约数
        sort(ys+1,ys+num+1);
        for (int i=num;i>0;i--)
        {
            if (ys[i]==ys[i+1]) continue;
            bool flag=true;long long ans=0;
            ans=(1+(n+1-ys[i]))*(n/ys[i])/2;//求出答案
            cout<<ans<<" ";
        }
        return 0;
    }
  • 相关阅读:
    重新整理 .net core 实践篇————防跨站脚本攻击[四十]
    重新整理 .net core 实践篇————重定向攻击[三十九]
    低数值精度推理和训练
    FinFET与芯片制程
    LLVM Backend技术
    安霸Ambarella CV系列芯片
    3D卷积,代码实现
    TVM darknet yolov3算子优化与量化代码的配置方法
    英特尔 QLC 3D NAND 数据存储
    Graph Representation 图神经网络
  • 原文地址:https://www.cnblogs.com/fmj123/p/CF1091C.html
Copyright © 2011-2022 走看看