【LGR-141-Div.2】洛谷 6 月月赛 I (前两题)

发布时间 2023-06-04 10:31:09作者: Kent530

T1:金盏花
传送门
直接暴力枚举前6位的值即可,记得开long long

#include<bits/stdc++.h>
using namespace std;
#define int long long
int y,z,ans=1e18;
signed main(){
	scanf("%lld%lld",&y,&z);
	for(int i=100000;i<=999999;i++){
		int x=i*1000000+y;
		ans=min(ans,abs(x-z));
	}
	printf("%lld\n",ans);
	return 0;
} 

T2:红草莓
传送门
稍微手算几组就可以发现对于ai,就是将所有为gcd(ai,n)的倍数的位置染为蓝色
那么根据这个性质写出代码发现只有70pts,只需要加一个判断ai之前是否出现过,如果出现过直接输出0(显然)
即可通过
复杂度应该是<=O(nlogn)的:
对于不重复的a数组(不防a1 < a2 < ... < an
复杂度为O(n/a1 + ... + n/an)<=O(n/1 + ... + n/n)=O(nlogn)

#include<bits/stdc++.h>
using namespace std;
int n,m;
int a[500005];
int gcd(int x,int y){
	if(y==0)return x;
	else return gcd(y,x%y);
}
bool vis[500005],p[500005];
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++)scanf("%d",&a[i]),a[i]=gcd(a[i],n);
	for(int i=1;i<=m;i++){
		if(p[a[i]]){
			printf("%d ",0);
			continue;
		}
		int sum=0;
		for(int j=0;j<n;j+=a[i])
			if(!vis[j]){
				vis[j]=1;
				sum++;
			}
		p[a[i]]=1;
		printf("%d ",sum);
	}
	puts("");
	return 0;
}