草庐IT

2022年牛客多校题第四场题解

Meteor的博客 2023-03-28 原文

2022年牛客多校第四场题解

N-Particle Arts

题目大意:
给定\(n\)个数字,每一次选两个数字\(a,b\),将\(a,b\)两个数字变成\(a \& b\)\(a \vert b\) 多次进行,一直到这些数字趋于一个稳定值,然后算这些数字的方差是多少.
方差公式:

  • \(\sigma^{2}=\frac{1}{n} \sum_{i=1}^{n}\left(x_{i}-\mu\right)^{2}\)
    where \(\mu=\frac{1}{n} \sum_{i=1}^{n} x_{i}\)
    题解:
      一开始我们想到给定\(a,b,c\)三个数字,然后当\(a\)\(b\) 发生反应之后(就是变成了\(a\&b\)\(a \vert b\)之后,\(a\)的值会变小,一个值会相对来说变小,一个值会相对来说变大,然后假设\(a\)变大,假设\(b\)变小,然后继续发生反应,一个值更大,一个值更小,然后小的和小再反应,这样一直反应,于是猜测最后会变成\(n-1\)\(a\&b\)\(1\)\(a \vert b\),然后计算方差就可以了,但是发现样例就寄了.)
     随后可以发现举例子,将样例的\(1,2,3,4,5\)的二进制表示出来,发现随着反应发生所有的1 都会提前,然后形成\(0,0,1,7,7\),然后就是这些数字的方差

code

//第一种写法 使用__int128进行重载然后暴力求解,麻了
#include<bits/stdc++.h>
using namespace std;
#define ll long long
__int128 read()
{
    __int128 x=0,f=1;
    char ch=getchar();
    while(!isdigit(ch)&&ch!='-')ch=getchar();
    if(ch=='-')f=-1;
    while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
    return f*x;
}
void print(__int128 x)
{
    if(x<0)putchar('-'),x=-x;
    if(x>9)print(x/10); 
    putchar(x%10+'0');
}
__int128 gcd(__int128 a,__int128 b)
{
    return b?gcd(b,a%b):a;
}
__int128 lcm(__int128 a,__int128 b)
{
    return a/gcd(a,b)*b;
}
struct Frac{
    __int128 fenzi,fenmu;
    Frac operator+(Frac other)
    {
        Frac res;
        // res.fenmu=lcm(fenmu,other.fenmu);
        res.fenmu=fenmu*other.fenmu;
        // res.fenzi=fenzi*res.fenmu/fenmu+other.fenzi*res.fenmu/other.fenmu;
        res.fenzi=fenzi*other.fenmu+fenmu*other.fenzi;
        return res;
    }
    Frac operator-(Frac other)
    {
        Frac res;
        res.fenmu=fenmu*other.fenmu;
        res.fenzi=fenzi*other.fenmu-fenmu*other.fenzi;
        return  res;
    }
    Frac operator*(Frac other)
    {
        Frac res;
        res.fenmu=fenmu*other.fenmu;
        res.fenzi=fenzi*other.fenzi;
        return res;
    }
    Frac operator/(__int128 x)
    {
        Frac res;
        res.fenmu=fenmu*x;
        res.fenzi=fenzi;
        return res;
    }
};

void solve(){
    int n;
    cin>>n;
    vector<__int128> a(n);
    for(int i=0;i<n;i++) a[i]=read();
    vector<bitset<64>> bit(n,bitset<64>());
    for(int i=0;i<n;i++)bit[i]=a[i];
    vector<int> cnt(64,0);
    for(int i=0;i<64;i++){
        for(auto j:bit)cnt[i]+=j[i];
    }
    vector<int> ans(n,0);
    for(int i=0;i<n;i++){
        for(int j=0;j<64;j++){
            if(cnt[j]){
                cnt[j]--;
                ans[i]|=1<<j;
            }
        }
    }
    Frac u{0,1},sigma{0,1};
    for(auto &i:ans)u=u+(Frac){i,1};
    u=u/n;
    for(auto &i:ans){
        auto temp=((Frac){i,1}-u)*((Frac){i,1}-u);
        sigma=sigma+temp;
        __int128 tt=gcd(sigma.fenmu,sigma.fenzi);
        if(tt==0) continue;
        sigma.fenmu/=tt;
        sigma.fenzi/=tt;
    }
    sigma=sigma/n;
    __int128 tt=gcd(sigma.fenmu,sigma.fenzi);
    if(tt==0)
    {
        cout<<"0/1"<<'\n';
        return;
    }
    print(sigma.fenzi/tt);
    cout<<"/";
    print(sigma.fenmu/tt);
}
int main(){
    int t=1;
    while(t--)solve();
}

//第二种写法,既然需要通分啥的,就不通分,直接往上搞,然后算
#include <bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define eps 1e-8
#define gcd(a,b) __gcd(a,b)
#define lcm(a,b) a/gcd(a,b)*b
#define lowbit(x) (x&-x)
#define all(x) x.begin(), x.end()
#define int128 __int128
#define debug(x...) do { cout<< #x <<" -> "; re_debug(x); } while (0)
void re_debug() { cout<<'\n'; }
template<class T, class... Ts> void re_debug(const T& arg,const Ts&... args) { cout<<arg<<" "; re_debug(args...); }
void cut(){ cout<<'\n'<<"------------"<<'\n';}
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> PII;
const int INF=0x3f3f3f3f;
const ll LNF=0x3f3f3f3f3f3f3f3fll;
const double PI=acos(-1.0);
__int128 read()
{
    __int128 x=0,f=1;
    char ch=getchar();
    while(!isdigit(ch)&&ch!='-')ch=getchar();
    if(ch=='-')f=-1;
    while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
    return f*x;
}
void print(__int128 x)
{
    if(x<0)putchar('-'),x=-x;
    if(x>9)print(x/10); 
    putchar(x%10+'0');
}
__int128 gcd(__int128 a,__int128 b)
{
    return b?gcd(b,a%b):a;
}
void solve()
{
    int n;
    cin>>n;
    vector<int128> q(n);
    for(int i=0;i<n;i++) q[i]=read();
    vector<int> cnt(32,0);
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<32;j++)
        {
            if(q[i]&(1<<j))
            {
                cnt[j]++;
            }
        }
    }
    for(int i=0;i<n;i++)
    {
        int k=0;
        for(int j=31;j>=0;j--)
        {
            if(cnt[j])
            {
                cnt[j]--;
                k|=(1<<j);
            }
        }
        q[i]=k;
    }
    int128 sum_x=0;
    for(int i=0;i<n;i++) sum_x+=q[i];
    int128 fenzi=0;
    for(int i=0;i<n;i++) fenzi+=(n*q[i]-sum_x)*(n*q[i]-sum_x);
    int128 fenmu=(int128)n*n*n;
    int128 t=gcd(fenzi,fenmu);
    print(fenzi/t);
    cout<<"/";
    print(fenmu/t);
}
int main()
{
    // IOS;
    int T=1;
   // cin>>T;
    while(T--) solve();
    return 0^0;
}

K-NIO's Sword

题意:有\(n\)个敌人,为\(1,2,3,到n\),只能一次顺序消灭,当前仅当\(A\equiv i \pmod{n}\),初始攻击力只有0,每一次可以增加伤害相当于在攻击力末尾加上\(x,x的范围是(0\le x\le 9)\)相当于\(10×A+x\).

题解:每一次我们可以暴力枚举\(l,r\),枚举这一次能枚举的范围,然后看这个i是否可以在这个范围内表示出来,就可以了,里面需要一些加速手段

#include <bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define eps 1e-8
#define gcd(a,b) __gcd(a,b)
#define lcm(a,b) a/gcd(a,b)*b
#define lowbit(x) (x&-x)
#define all(x) x.begin(), x.end()
#define debug(x...) do { cout<< #x <<" -> "; re_debug(x); } while (0)
void re_debug() { cout<<'\n'; }
template<class T, class... Ts> void re_debug(const T& arg,const Ts&... args) { cout<<arg<<" "; re_debug(args...); }
void cut(){ cout<<'\n'<<"------------"<<'\n';}
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> PII;
const int INF=0x3f3f3f3f;
const ll LNF=0x3f3f3f3f3f3f3f3fll;
const double PI=acos(-1.0);
ll A=0;
int n;
ll qmi(ll a,ll b)//快速幂
{
    ll ans=1;
    while(b)
    {
        if(b&1) ans=ans*a;
        a=a*a;
        b>>=1;
    }
    return ans;
}
ll get(int i,int j)//得到最大的数字 就是相当于在这个数字后面加9
{
    ll ans=i;
    for(int k=0;k<j;k++)
    {
        ans*=10;
        ans+=9;
        // ans*=10;
        
    }
    return ans;
}
bool check(ll i,ll j)
{
    //A在mod n的情况下与i同余,可以认为i+n+n+n是否在这个能表示的范围里面
    //j是倍数,i是当前要搞的值
    //l 和r是能表示左右区间
    ll l=A*qmi(10,j),r=get(i-1,j);
    i+=(l-1)/n*n;//将前面的数字快速加上,要不然TLE
    while(true)
    {
        if(i>r) return false;//超了
        if(l<=i&&i<=r) return true;
        i+=n;//每一次都+n+n,判断
    }
}

void solve()
{
    cin>>n;
    if(n==1)
    {
        cout<<0<<'\n';
        return;
    }
    int ans=0;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=10;j++)//最多枚举10下,
        {
            if(check(i,j))
            {
                A=i;
                // debug(A);
                // debug(j);
                ans+=j;
                break;
            }
        }
    }
    cout<<ans<<'\n';
}
int main()
{
    IOS;
    int T=1;
    //cin>>T;
    while(T--) solve();
    return 0^0;
}

有关2022年牛客多校题第四场题解的更多相关文章

  1. 牛客网专项练习30天Pytnon篇第02天 - 2

    1.在Python3中,下列关于数学运算结果正确的是:(B)a=10b=3print(a//b)print(a%b)print(a/b)A.3,3,3.3333...B.3,1,3.3333...C.3.3333...,3.3333...,3D.3.3333...,1,3.3333...解析:    在Python中,//表示地板除(向下取整),%表示取余,/表示除(Python2向下取整返回3)2.如下程序Python2会打印多少个数:(D)k=1000whilek>1:    print(k)k=k/2A.1000 B.10C.11D.9解析:    按照题意每次循环K/2,直到K值小于等

  2. 映宇宙2022年营收63亿元:同比下降三成,毛利率提升4.3个百分点 - 2

    3月26日,映宇宙(HK:03700,即“映客”)发布截至2022年12月31日的2022年度业绩财务报告。财报显示,映宇宙2022年的总营收为63.19亿元,较2021年同期的91.76亿元下降31.1%。2022年,映宇宙的经营亏损为4698.7万元,2021年同期则为净利润4.57亿元;期内亏损(净亏损)为1.68亿元,2021年同期的净利润为4.33亿元;非国际财务报告准则经调整净利润为3.88亿元,2021年同期为4.82亿元,同比下降19.6%。 映宇宙在财报中表示,收入减少主要是由于行业竞争加剧,该集团对旗下产品采取更为谨慎的运营策略以应对市场变化。不过,映宇宙的毛利率则有所提升

  3. ruby-on-rails - Ruby:给定日期找到下一个第二或第四个星期二 - 2

    我似乎找不到一种优雅的方式来做到这一点......给定一个日期,我如何找到下一个星期二,即日历月的第2个或第4个星期二?例如:给定2012-10-19然后返回2012-10-23或给定2012-10-31然后返回2012-11-13OctoberNovemberSuMoTuWeThFrSaSuMoTuWeThFrSa12345612378910111213456789101415161718192011121314151617212223242526271819202122232428293031252627282930 最佳答案

  4. IDEA 2022 创建 Spring Boot 项目详解 - 2

    如何用IDEA2022创建并初始化一个SpringBoot项目?目录如何用IDEA2022创建并初始化一个SpringBoot项目?0. 环境说明1.  创建SpringBoot项目 2.编写初始化代码0. 环境说明IDEA2022.3.1JDK1.8SpringBoot1.  创建SpringBoot项目        打开IDEA,选择NewProject创建项目。        填写项目名称、项目构建方式、jdk版本,按需要修改项目文件路径等信息。        选择springboot版本以及需要的包,此处只选择了springweb。        此处需特别注意,若你使用的是jdk1

  5. 2022年10月23日周赛ZZULIOJ - 2

    文章目录问题B:芝华士威士忌和他的小猫咪们代码&注释问题C:愿我的弹雨能熄灭你们的痛苦代码注释问题D:猜糖果游戏代码注释问题E:有趣的次方代码注释问题F:这是一个简单题代码&注释问题G:打印矩阵代码注释问题H:scz的简单考验代码注释问题I:完美区间代码&注释问题J:是狂热的小迷妹一枚吖~代码&注释2022年10月23日周赛ZZULIOJ问题B:芝华士威士忌和他的小猫咪们时间限制:1Sec内存限制:128MB题目描述芝华士威士忌很喜欢带着他的猫咪们一块跑着玩。但是小猫咪们很懒,只有在离他y米以内才愿意和他一块跑。这天他在坐标为x的位置,他想和他的猫咪们一块跑着玩。有n个小猫咪,第i个小猫咪在坐

  6. 【华为OD机试真题 java、python、c++】荒地电站建设【2022 Q4 100分】(100%通过+复盘思路) - 2

    代码请进行一定修改后使用,本代码保证100%通过率,本题目提供了java、python、c++三种代码。复盘思路在文章的最后题目描述祖国西北部有一片大片荒地,其中零星的分布着一些湖泊,保护区,矿区;整体上常年光照良好,但是也有一些地区光照不太好。某电力公司希望在这里建设多个光伏电站,生产清洁能源对每平方公里的土地进行了发电评估,其中不能建设的区域发电量为0kw,可以发电的区域根据光照,地形等给出了每平方公里年发电量x千瓦。我们希望能够找到其中集中的矩形区域建设电站,能够获得良好的收益。输入描述第一行输入为调研的地区长,宽,以及准备建设的电站【长宽相等,为正方形】的边长最低要求的发电量之后每行为

  7. 玩客云刷机(2022-3-19亲测) - 2

    https://cloud.189.cn/t/BJbYreYbmUj2(访问码:djz6)(网盘2022-4-1更新)一、刷入armbian。1.1使用AmlBurnTool软件烧录首选底包至固件。烧录完成后断开玩客云电源备用。(靠近hdmi的那个口子。)1.2使用WIn32diskimager软件将emmc固件写入U盘。1.3写入成功后,先将U盘插入玩客云靠近网线接口端的USB口,再接入电源。玩客云通电后指示灯会先亮绿灯,再亮蓝灯,红蓝闪烁,最后蓝灯常亮。等到确定蓝灯常亮后,再拔掉U盘、电源。(最好蓝灯常亮后,启动一次玩客云,看看ssh是否正常。)1.4使用WIn32diskimager写入

  8. ruby-on-rails - Ruby DateTime 格式 : How can I get 1st, 第二、第三、第四? - 2

    首先,DateTime格式变量似乎没有在任何地方记录,因此对可以在rubydocs中向我展示此内容的任何人+1。其次,在查看Date.strftime函数代码时,我没有看到任何可以让我执行以下操作的内容:2010年9月9日,星期四有人知道这是否可行吗? 最佳答案 您可能想要takealookhere.总结time=DateTime.nowtime.strftime("%A,%B#{time.day.ordinalize}%Y")请注意,您在纯Ruby(2.0)中运行,您需要调用:require'active_support/core

  9. AiBote 2022 新研发的自动化框架,支持 Android 和 Windows 系统。速度非常快 - 2

    Ai-Bot基于流行的Node.js和JavaScript语言的一款新自动化框架,支持Windows和Android自动化。1、Windowsxpath元素定位算法支持支持Windows应用、.NET、WPF、Qt、Java和Electron客户端程序和ie、edgechrome浏览器2、Android支持原生APP和H5界面,元素定位速度是appium十倍,无线远程自动化操作多台安卓设备3、基于opencv图色算法,支持找图和多点找色,1080*2340全分辨率找图50MS以内4、内置免费OCR人工智能技术,无限制获取图片文字和找字功能。5、框架协议开源,除官方node.jsSDK外,用户可

  10. 考勤刷卡 最大和 简单 蓝桥杯省赛 2022 - 2

    问题描述小蓝负责一个公司的考勤系统,他每天都需要根据员工刷卡的情况来确定每个员工是否到岗。当员工刷卡时,会在后台留下一条记录,包括刷卡的时间和员工编号,只要在一天中员工刷过一次卡,就认为他到岗了。现在小蓝导出了一天中所有员工的刷卡记录,请将所有到岗员工的员工编号列出。输入格式输入的第一行包含一个正整数n,表示一天中所有员工的刷卡记录的条数。接下来n行,每行包含一条刷卡记录,每条刷卡记录的格式为:HH:MM:SSID其中HH:MM:SS表示刷卡时间,HH为一个0到23之间的两位十进制整数(可能含前导0)表示时,MM为一个0到59之间的两位十进制整数(可能含前导0)表示分,SS为一个0到59之间的

随机推荐