CF1548B Integers Have Friends

Posted Jozky86

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CF1548B Integers Have Friends相关的知识,希望对你有一定的参考价值。

CF1548B Integers Have Friends

题意:

给定 n 和一个长度为 n 的数组 a,求一个最长的区间 [ l , r ] \\left[l,r\\right] [l,r],使得存在 m ≥ 2 和 k m\\geq 2 和 k m2k,对于所有 l ≤ i ≤ r l\\leq i\\leq r lir, a i ≡ k ( m o d    m ) a_{i}≡k(\\mod m) aik(modm)(即区间内所有数对 m 取模余数相等),输出最长区间长度(区间长度定义为 r-l+1)。
有多组测试数据。

题解:

题目问所有数对m取模余数相等,说明对于所有数都是 x i = k i m + w x_{i}=k_{i}m+w xi=kim+w,那么我们让相邻的 x i x_{i} xi相减,这样得到 b i = ( k i − k i − 1 ) ∗ m b_{i}=(k_{i}-k_{i-1})*m bi=(kiki1)m,也就是说所有的b数组都是m的倍数,其gcd为b
那么问题就变成找最长的子区间,使得子区间的gcd>1
gcd是满足单调性的,所以我们可以单调的寻找区间,如何快速求区间的gcd,可以用st表

代码:

#include <bits/stdc++.h>
#include <unordered_map>
#define debug(a, b) printf("%s = %d\\n", a, b);
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> PII;
clock_t startTime, endTime;
//Fe~Jozky
const ll INF_ll= 1e18;
const int INF_int= 0x3f3f3f3f;
void read(){};
template <typename _Tp, typename... _Tps> void read(_Tp& x, _Tps&... Ar)
{
    x= 0;
    char c= getchar();
    bool flag= 0;
    while (c < '0' || c > '9')
        flag|= (c == '-'), c= getchar();
    while (c >= '0' && c <= '9')
        x= (x << 3) + (x << 1) + (c ^ 48), c= getchar();
    if (flag)
        x= -x;
    read(Ar...);
}
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');
}
void rd_test()
{
#ifdef ONLINE_JUDGE
#else
    startTime = clock ();
    freopen("data.in", "r", stdin);
#endif
}
void Time_test()
{
#ifdef ONLINE_JUDGE
#else
    endTime= clock();
    printf("\\nRun Time:%lfs\\n", (double)(endTime - startTime) / CLOCKS_PER_SEC);
#endif
}
const int maxn=2e5+9;
ll a[maxn];

ll gcd(ll a,ll b){
	if(b)return gcd(b,a%b);
	return a;
}
ll b[maxn];

ll lg[maxn];
void init(){
	lg[0]=-1;
	for(int i=1;i<=200005;i++){
		lg[i]=lg[i>>1]+1;
	} 
}
ll f[maxn][40];
void st(int n){
	for(int i=1;i<=n;i++)
		f[i][0]=b[i];
		
	for(int k=1;k<=lg[n];k++){
		for(int i=1;i<=n-(1<<k)+1;i++){
			f[i][k]=gcd(f[i][k-1],f[i+(1<<(k-1))][k-1]);
		}
	}	
}
ll query(int l,int r){
	int k=lg[r-l+1];
	return gcd(f[l][k],f[r-(1<<k)+1][k]);
} 
int main()
{
//    rd_test();
	int t;
	read(t);
	init();
	while(t--){
		int n;
		read(n);
		
		for(int i=1;i<=n;i++)read(a[i]);
		if(n==1){
			cout<<1<<endl;
			continue;
		}
		for(int i=1;i<n;i++){
			b[i]=abs(a[i+1]-a[i]);
		}
		n--;
		st(n);
		int ans=0;
		for(int i=1;i<=n;i++){
//			if(b[i]==1)continue;
			int l=i,r=n;
			while(l<r){
				int mid=l+r+1>>1;
				if(query(i,mid)==1)r=mid-1;
				else l=mid;
			}
			if(query(i,l)!=1)ans=max(ans,l-i+1);
		}
		cout<<ans+1<<endl;
	}
    //Time_test();
}




以上是关于CF1548B Integers Have Friends的主要内容,如果未能解决你的问题,请参考以下文章

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

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

Codeforces1548 B. Integers Have Friends(gcd,差分,二分,st表)

CF870A Search for Pretty Integers

[CF920G]List Of Integers

cf455A boredom