[SCU 4519] 来签个到吧 (GCD + 期望)

2024-06-21 19:58
文章标签 期望 gcd scu 签个 4519

本文主要是介绍[SCU 4519] 来签个到吧 (GCD + 期望),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

SCU - 4519

盒子里有若干个球,每个球上面都有一个数字,数字各不相同
每次从中选两个数字 x,y,设 z= |xy|
若 z不在盒子中,则加入这个数
反复执行操作,直到无法再向盒子里加数
随机从盒子中摸出一个球,反复执行这个操作直到所有球都被摸出来过
问最后的期望步数


第一部分的构造:
设所有数的最大公因数是D
则所有数可以表示为 x=kD
所以所有的 |yx|=kD ,必然是 D的倍数
实际上这个相减的过程是更相减损法的再现
所以保证一定能构造出最大公因数 D
构造出 D后,用最大的数不断减去 D,
就能构造出小于最大数的所有 D的倍数

第二部分的期望:
dp[i] 为摸到 i个求的期望步数
dp[i]=N(i1)Ndp[i1]+(i1)Ndp[i]+1
移项整理后可得 dp[i]=dp[i1]+NN(i1)

最后的期望步数要加上第一部分构造时所用的步数

#pragma comment(linker, "/STACK:102400000,102400000")
#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <map>
#include <set>
#include <queue>
using namespace std;
typedef pair<int,int> Pii;
typedef long long LL;
typedef unsigned long long ULL;
typedef double DBL;
typedef long double LDBL;
#define MST(a,b) memset(a,b,sizeof(a))
#define CLR(a) MST(a,0)
#define Sqr(a) (a*a)
int GCD(int a,int b){return b?GCD(b,a%b):a;};const int maxn=1e5+10;
int N;
int inpt[maxn];
DBL dp[maxn];int main()
{#ifdef LOCALfreopen("in.txt", "r", stdin);
//  freopen("out.txt", "w", stdout);#endifint T;scanf("%d", &T);for(int ck=1; ck<=T; ck++){scanf("%d", &N);CLR(dp);for(int i=0; i<N; i++) scanf("%d", &inpt[i]);sort(inpt,inpt+N);int gcd=inpt[0];for(int i=1; i<N; i++) gcd=GCD(gcd,inpt[i]);int tot=inpt[N-1]/gcd;if(!inpt[0]) tot++;dp[1]=1;for(int i=2; i<=tot; i++){DBL down=tot-i+1,up=tot;dp[i]=dp[i-1]+up/down;}cout << (int)floor(dp[tot])+tot-N << '\n';
//      printf("%d\n", floor(dp[tot])+tot-N);}return 0;
}

这篇关于[SCU 4519] 来签个到吧 (GCD + 期望)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1082185

相关文章

每日一题~cf 970 div3 (A思维,B小模拟,C二分,D排列数建图成环,E 26个字母暴力+前缀和,F 逆元,G 数论gcd )

A 题意: 有 a 个1 ,b 个2.问是否能将这些数划分为两个数值相等的集合。 输出 YES 或者 NO —————— 问题等价于 将数组 分成两个数值相同的数组。所以sum 应该是偶数。也就是说 1 的个数是偶数。在i1的个数是偶数的情况下,将 2 分成两份,如果2 的个数是偶数,OK。如果是奇数那么需要1来补齐,如果1 的个数大于等于2那么可以补齐。(1 的个数是偶数,需要2个1来补齐,剩下

iOS——GCD再学习

GCD 使用GCD好处,具体如下: GCD 可用于多核的并行运算;GCD 会自动利用更多的 CPU 内核(比如双核、四核);GCD 会自动管理线程的生命周期(创建线程、调度任务、销毁线程);程序员只需要告诉 GCD 想要执行什么任务,不需要编写任何线程管理代码。 任务与队列 概念 **任务:就是执行操作的意思,换句话说就是你在线程中执行的那段代码。**在 GCD 中是放在 block 中

GCD常用函数拾遗

目录 dispatch_block_t监听block执行结束dispatch_block_waitdispatch_block_notify 撤销block总结参考 这几天偶尔又回顾了下GCD的知识。之前我一直以为自己对于GCD已经大体有个整体掌握了,却发现仍还有一些知识点的遗漏。于是写在这里,算是对之前GCD常用函数文章的补充。 dispatch_block_t 在GCD中

环上k划分的和的gcd的最大值【gcd基本性质的利用】

今早看到的题,想了下会做了,但是觉得这题挺有意思的,于是打算写一下做法。本题利用了gcd的基本性质:更相减损法以及结合律,平时做gcd的题基本没用到过这两性质,而本题对这性质进行了充分利用。 思路: 首先我们考虑给一个序列,我们该怎么做。 令 fn=∑ni=1ai f_n=\sum_{i=1}^n a_i。 我们考虑序列的一个 k+1 k+1划分 fx1,fx2−fx1,fx3−fx2

猫猫学iOS(五十一)多线程网络之GCD下载合并图片_队列组的使用

猫猫分享,必须精品 原创文章,欢迎转载。转载请注明:翟乃玉的博客 地址:http://blog.csdn.net/u013357243?viewmode=contents 合并图片(图片水印)第一种方法 效果 实现: 思路: 1.分别下载2张图片:大图片、LOGO 2.合并2张图片 3.显示到一个imageView身上 // 异步下载dispatch_async(dis

猫猫学iOS(五十)多线程网络之GCD简单介绍(任务,队列)

猫猫分享,必须精品 原创文章,欢迎转载。转载请注明:翟乃玉的博客 地址:http://blog.csdn.net/u013357243?viewmode=contents GCD简单介绍 1.什么是GCD? 全称是Grand Central Dispatch,可译为“牛逼的中枢调度器” 纯C语言,提供了非常多强大的函数 2.GCD的优势 GCD是苹果公司为多核的并行运算提出的解决方

概率、期望

UVA1636 决斗 Headshot #include <bits/stdc++.h>using namespace std;char s[110];int shoot, no, len;int main(){while(scanf("%s", &s)!=EOF){shoot=0;no=0;len=strlen(s);s[len]=s[0]; for(int i=0; i<len;

概率学 笔记一 - 概率 - 随机变量 - 期望 - 方差 - 标准差(也不知道会不会有二)

概率不用介绍,它的定义可以用一个公式写出: 事件发生的概率 = 事件可能发生的个数 结果的总数 事件发生的概率=\cfrac{事件可能发生的个数}{结果的总数} 事件发生的概率=结果的总数事件可能发生的个数​ 比如一副标准的 52 张的扑克牌,每张牌都是唯一的,所以,抽一张牌时,每张牌的概率都是 1/52。但是有人就会说了,A 点明明有四张,怎么会是 1/52 的概率。 这就需要精准的指出

iOS面试:GCD的队列(dispatch_queue_t)分哪两种类型?

在 iOS 开发中,Grand Central Dispatch (GCD) 提供了强大的并发执行任务的能力。dispatch_queue_t 是 GCD 中的一个重要对象,用于管理和调度要执行的任务。GCD 的队列主要可以分为两种类型: 1. 串行队列(Serial Queues) 串行队列确保在同一时间只执行一个任务。任务按照它们被添加的顺序逐个执行。这种队列适用于需要操作共享资源的场景,

2015年总结与2016年期望

2015年度工作述职报告 部门:   设计部        职位:   前端工程师    时间: 2016 年 01 月 11 日 1. 工作中的心得以及收获 一、回顾2015参与的项目: 溯源:质量报告,检测报告,打印BUG 工作台:bootstrap版 --> 微信切换版(张鑫旭)--> SUI框架版 工作台模块:工厂和分仓,经销商,业务员,会员,导购,销管等工