UPC备战省赛组队训练赛第十七场

            with zyd,mxl

G: Greatest Common Divisor

题目描述
There is an array of length n, containing only positive numbers.
Now you can add all numbers by many times.
Please find out the minimum times you need to perform to obtain an array whose greatest common divisor(gcd) is larger than or state that it is impossible.
You should notice that if you want to add one number by , you need to add all numbers by at the same time. 输入
The first line of input file contains an integer T (≤T≤), describing the number of test cases.
Then there are ×T lines, with every two lines representing a test case.
The first line of each case contains a single integer n (≤n≤1e5) described above.
The second line of that contains n integers ranging in [,1e9]. 输出
You should output exactly T lines.
For each test case, print Case d: (d represents the order of the test case) first.
Then output exactly one integer representing the answer.
If it is impossible, print - instead.

题目描述

样例输入

样例输出
Case :
Case : -
Case :

样例输入输出

题意:

  定义a[]数组存储输入的 n 个数;

  求使得 ∀i∈[1,n] GCD(a[i]+x) > 1 的最小的 x;

  如果不存在这样的x,输出-1;

思路:

  将数组 a 排序,去重;

  ①去重后,如果只有一个元素,输出 (a[1] == 1 ? 1:0);

  ②找到相邻两数差值的GCD记为gcd:

    (2.1)如果 gcd == 1 ,输出 -1

    (2.2)反之,所有数肯定可以通过增加 x 使得所有数变为 gcd 的倍数,当然也可以变为gcd因子的倍数,

      求解出最小的x输出;

AC代码:

 #include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=1e5+; int n;
int a[maxn]; int GCD(int _a,int _b)
{
return _a == ? _b:GCD(_b%_a,_a);
}
ll Solve()
{
sort(a+,a+n+);
int t=unique(a+,a+n+)-a;
t--;
if(t == )///情况①
return a[] == ? :; ll gcd=a[]-a[];
for(int i=;i <= t;++i)
gcd=GCD(gcd,a[i]-a[i-]); if(gcd == )///情况(2.1)
return -;
ll ans=(a[]/gcd+(a[]%gcd == ? :))*gcd-a[];///情况(2.2)
for(ll i=;i*i <= gcd;++i)
{
if(gcd%i != )
continue;
ll j=gcd/i;
///找到最小的 curAns 使得所有数 +curAns 都可以变为 i,j 的倍数
ll curAns=(a[]/i+(a[]%i == ? :))*i-a[];
curAns=min(curAns,(a[]/j+(a[]%j == ? :))*j-a[]);
ans=min(ans,curAns);
}
return ans;
}
int main()
{
int test;
scanf("%d",&test);
for(int kase=;kase <= test;++kase)
{
scanf("%d",&n);
for(int i=;i <= n;++i)
scanf("%d",a+i); printf("Case %d: %lld\n",kase,Solve());
}
return ;
}

小结:

 比赛的时候,只考虑了使所有的数都变成gcd的最小的因子的倍数的情况;
并没有考虑到所有数变成gcd的其他因子的倍数使得答案最小;
赛后,吃完午饭美美的睡上了一觉;
午睡刚醒,就看到队友zyd给我发的G题ac的截图;
一脸懵逼的我问了句为啥????
例如 差值为21
21的非1的因子有3,,
所有数都变成3的倍数需要 +
所有数都变成7的倍数需要 +
所有数都变成21的倍数需要 +
答案当然是1啦,所以说,最优解不一定是变成gcd最小因子的倍数

CCPC2018 桂林 G "Greatest Common Divisor"(数学)的更多相关文章

  1. 2018CCPC桂林站G Greatest Common Divisor

    题目描述 There is an array of length n, containing only positive numbers.Now you can add all numbers by ...

  2. hdu 5207 Greatest Greatest Common Divisor 数学

    Greatest Greatest Common Divisor Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/ ...

  3. 最大公约数和最小公倍数(Greatest Common Divisor and Least Common Multiple)

    定义: 最大公约数(英语:greatest common divisor,gcd).是数学词汇,指能够整除多个整数的最大正整数.而多个整数不能都为零.例如8和12的最大公因数为4. 最小公倍数是数论中 ...

  4. upc组队赛17 Greatest Common Divisor【gcd+最小质因数】

    Greatest Common Divisor 题目链接 题目描述 There is an array of length n, containing only positive numbers. N ...

  5. [UCSD白板题] Greatest Common Divisor

    Problem Introduction The greatest common divisor \(GCD(a, b)\) of two non-negative integers \(a\) an ...

  6. greatest common divisor

    One efficient way to compute the GCD of two numbers is to use Euclid's algorithm, which states the f ...

  7. 845. Greatest Common Divisor

    描述 Given two numbers, number a and number b. Find the greatest common divisor of the given two numbe ...

  8. CF1025B Weakened Common Divisor 数学

    Weakened Common Divisor time limit per test 1.5 seconds memory limit per test 256 megabytes input st ...

  9. LeetCode 1071. 字符串的最大公因子(Greatest Common Divisor of Strings) 45

    1071. 字符串的最大公因子 1071. Greatest Common Divisor of Strings 题目描述 对于字符串 S 和 T,只有在 S = T + ... + T(T 与自身连 ...

随机推荐

  1. golang的变量

    (1)只声明:var 变量名字 类型              var a int             var a, b, c,d int      只有类型,如果初始化表达式被省略,那么将用零值 ...

  2. Effective Modern C++:04智能指针

    裸指针有着诸多缺点:裸指针的声明中看不出它指向的是单个对象还是数组:裸指针的声明中也无法看出使用完它指向的对象后是否需要删除,也就是声明中看不出裸指针是否拥有其指向的对象:即使知道要析构裸指针指向的对 ...

  3. 用dreamweaver查找页面位置

    复制页面的一段代码,然后用Dreamweaver在整个项目中查找代码. 找不到的原因:1.查找的内容是从数据库中读出来的.连数据库文件一起查便知. 2.查找的代码是某个函数生成的.

  4. [React Native]获取网络状态

    使用React Native,可以使用NetInfo API获取手机当前的各个网络状态. componentWillMount() { NetInfo.fetch().done((status)=&g ...

  5. 生成主键ID,唯一键id,分布式ID生成器雪花算法代码实现

    工具类:  package com.ihrm.common.utils; import java.lang.management.ManagementFactory; import java.net. ...

  6. selenium实现网页截全屏

    from selenium import webdriver options = webdriver.ChromeOptions() options.add_argument('--headless' ...

  7. python 嵌套列表

  8. Oracle函数——TO_DATE

    TO_DATE 含义:将具有固定格式的字符串类型的数据转化为相对应的Date类型数据,官网解释如下图   使用方法 TO_DATE("需要转换的字符串","日期格式&qu ...

  9. Mysql查询某个月的每一天的数据

    需求:查询最近三个月的每一天的业绩总和 因为最近三个月每个月的天数是不一样,所以不能用这篇文章:Mysql查询最近30天的数据(每天的业绩总和数据) 介绍的用固定多少天去查数据.需要一个新方法. 一. ...

  10. 异常处理之try catch finally

    package com.sxt.wrapper.test2; /* 0418 * 异常处理 * 采用异常处理的好处:保证程序发生异常后可以继续执行 * e.printStaceTrace:打印堆栈信息 ...