2021HDU多校9 - 7073 Integers Have Friends 2.0(随机数)

Posted Frozen_Guardian

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021HDU多校9 - 7073 Integers Have Friends 2.0(随机数)相关的知识,希望对你有一定的参考价值。

题目链接:点击查看

题目大意:给出一个长度为 n n n 的序列,找到一个长度最长的子序列,满足存在一个模数 m m m,使得这个子序列中的所有数取模后相等

题目分析:挺有意思的一道题,首先假如取 m = 2 m=2 m=2 的话,那么所有数字非奇即偶,所以答案至少是 ⌈ n 2 ⌉ \\lceil \\frac{n}{2}\\rceil 2n

假如我们随机选两个位置 x , y x,y x,y,满足 x ≠ y x\\neq y x=y,那么这两个位置同时位于答案中的概率至少为 1 4 \\frac{1}{4} 41,也就是说选不中的概率为 3 4 \\frac{3}{4} 43

再假如我们选择的 x x x y y y 属于答案中,那么 m m m 可行的取值是 ∣ ( a x − a y ) |(a_x-a_y) (axay),筛出质因子后每次 O ( n ) O(n) O(n) 去计算答案就可以了

那么对上述操作执行 K K K 次,每次都选不中答案的概率就是 ( 3 4 ) K (\\frac{3}{4})^K (43)K,当 K = 40 K=40 K=40 时,这个数值就是 1 0 − 5 10^{-5} 105 级别的了

需要注意的是,答案记得初始化为 a n s = 1 ans=1 ans=1,因为上面的操作只能计算答案大于等于二的情况

因为 HDU 的上古评测机,还是建议打个欧拉筛优化一下筛质因子的过程,能快不少

代码:

// Problem: Integers Have Friends 2.0
// Contest: Virtual Judge - HDU
// URL: https://vjudge.net/problem/HDU-7073
// Memory Limit: 262 MB
// Time Limit: 5000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

// #pragma GCC optimize(2)
// #pragma GCC optimize("Ofast","inline","-ffast-math")
// #pragma GCC target("avx,sse2,sse3,sse4,mmx")
#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#include<bitset>
#include<list>
#include<unordered_map>
#define lowbit(x) (x&-x)
using namespace std;
typedef long long LL;
typedef unsigned long long ull;
template<typename T>
inline void read(T &x)
{
    T f=1;x=0;
    char ch=getchar();
    while(0==isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
    while(0!=isdigit(ch)) x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
    x*=f;
}
template<typename T>
inline void write(T x)
{
    if(x<0){x=~(x-1);putchar('-');}
    if(x>9)write(x/10);
    putchar(x%10+'0');
}
const int inf=0x3f3f3f3f;
const int N=1e6+100;
mt19937_64 eng(time(NULL));
LL a[N];
int n;
int cal(LL x,LL y) {
    int cnt=0;
    for(int i=1;i<=n;i++) {
        cnt+=a[i]%x==y;
    }
    return cnt;
}
int main()
{
#ifndef ONLINE_JUDGE
//    freopen("data.in.txt","r",stdin);
//    freopen("data.out.txt","w",stdout);
#endif
//    ios::sync_with_stdio(false);
    int w;
    cin>>w;
    while(w--) {
        scanf("%d",&n);
        uniform_int_distribution<int>ran(1,n);
        for(int i=1;i<=n;i++) {
            scanf("%lld",a+i);
        }
        int ans=1;
        for(int K=1;K<=30;K++) {
            int l=-1,r=-1;
            while(l==r) {
                l=ran(eng),r=ran(eng);
            }
            LL tmp=llabs(a[l]-a[r]);
            for(int i=2;1LL*i*i<=tmp;i++) {
                if(tmp%i==0) {
                    ans=max(ans,cal(i,a[l]%i));
                    while(tmp%i==0) {
                        tmp/=i;
                    }
                }
            }
            if(tmp>1) {
                ans=max(ans,cal(tmp,a[l]%tmp));
            }
        }
        printf("%d\\n",ans);
    }
    return 0;
}

以上是关于2021HDU多校9 - 7073 Integers Have Friends 2.0(随机数)的主要内容,如果未能解决你的问题,请参考以下文章

HDU多校9 Rikka with Nash Equilibrium(记忆化搜索/dp)

[HDU7073] Integers Have Friends 2.0 -随机大法好

HDU 4968(杭电多校#9 1009题)Improving the GPA (瞎搞)

HDU 5399 Too Simple(过程中略微用了一下dfs)——多校练习9

HDU多校赛第9场 HDU 4965Fast Matrix Calculation矩阵运算+数学小知识

HDU 5399 Too Simple (多校比赛第9场)