为了能到远方,脚下的每一步都不能|

园龄:粉丝:关注:

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


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;
}

本文作者:kent

本文链接:https://www.cnblogs.com/kentsbk/p/17455288.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   Kent530  阅读(92)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起