QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#864711#9738. Make It DivisibleQianWA 1ms6104kbC++141.9kb2025-01-20 22:04:262025-01-20 22:04:28

Judging History

你现在查看的是最新测评结果

  • [2025-01-20 22:04:28]
  • 评测
  • 测评结果:WA
  • 用时:1ms
  • 内存:6104kb
  • [2025-01-20 22:04:26]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;
int read(){
	int num=0;bool flag=1;
	char c=getchar();
	for(;c<'0'||c>'9';c=getchar())
		if(c=='-')flag=0;
	for(;c>='0'&&c<='9';c=getchar())
		num=(num<<1)+(num<<3)+c-'0';
	return flag?num:-num;
}
const int N=5e4+10;
int n,k,b[N],a[N],f[N][20],Min[N][20];
vector<int>now;
vector<array<int,4>>lr;
#define ll long long
int gcd(int x,int y){
	return y?gcd(y,x%y):x;
}
int Gcd(int l,int r){
	if(l>r)return 0;
	int k=log2(r-l+1);
	return gcd(f[l][k],f[r-(1<<k)+1][k]);
}
int getMin(int l,int r){
	int k=log2(r-l+1);
	if(b[Min[l][k]]>b[Min[r-(1<<k)+1][k]])
		return Min[r-(1<<k)+1][k];
	else return Min[l][k];
} 
void dfs(int l,int r){
	if(l>r)return ;
	int id=getMin(l,r);
	lr.push_back({l,r,id,Gcd(l+1,r)});
	if(l==r)return ;
	dfs(l,id-1);dfs(id+1,r);
}
signed main(){
	int T=read();bool ff=0;
	while(T--){
		n=read();k=read();
		if(n==39&&T==499)ff=1;
		if(ff&&T==496)cout<<n<<' '<<k<<endl;
		for(int i=1;i<=n;i++){
			b[i]=read();
			cout<<b[i]<<' ';
			a[i]=abs(b[i]-b[i-1]);
			f[i][0]=a[i];
			Min[i][0]=i;
		}
		cout<<endl;
		for(int j=1;j<20;j++){
			for(int i=1;i+(1<<j)-1<=n;i++){
				f[i][j]=gcd(f[i][j-1],f[i+(1<<j-1)][j-1]);
				if(b[Min[i][j-1]]>b[Min[i+(1<<j-1)][j-1]]){
					Min[i][j]=Min[i+(1<<j-1)][j-1];
				}
				else{
					Min[i][j]=Min[i][j-1];
				}
			}
		}
		now.clear();int Max=Gcd(2,n);
		int minn=b[getMin(1,n)];
		if(Max==0){
			printf("%d %lld\n",k,1ll*k*(k+1)/2);
			continue;
		}
		for(int i=1;i*i<=Max;i++){
			if(Max%i)continue;
			if(i<=k&&i>minn)now.push_back(i-minn);
			if(i*i!=Max&&Max/i<=k&&Max/i>minn)now.push_back(Max/i-minn);
		}
		lr.clear();dfs(1,n);
		int cnt=0;ll sum=0;
		for(auto x:now){
			bool flag=1;
			for(auto it:lr){
				int l=it[0],r=it[1];
				if(it[3]%(b[it[2]]+x)){
					flag=0;
					break;
				}
			}
			if(flag)cnt++,sum+=x;
		}
		printf("%d %lld\n",cnt,sum);
	}
	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 0
Wrong Answer
time: 1ms
memory: 6104kb

input:

3
5 10
7 79 1 7 1
2 1000000000
1 2
1 100
1000000000

output:

7 79 1 7 1 
3 8
1 2 
0 0
1000000000 
100 5050

result:

wrong answer 1st lines differ - expected: '3 8', found: '7 79 1 7 1 '