牛客网小白月赛5 std帖

可能有些代码没有考虑到边界情况,但是数据应该都是对的,大家谅解下,不喜勿喷啊:

ProblemA: 无关(relationship)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL; 
inline LL read()
{
    char c=getchar(); LL num=0,f=1;
    while (c<'0'||c>'9') { if (c=='-') f=-1; c=getchar(); }
    while (c<='9'&&c>='0') { num=num*10+c-'0'; c=getchar(); }
    return num*f;
}
LL n,a[35],L,R,ans,bin[35];
LL gcd(LL a,LL b)
{
    return  b?gcd(b,a%b):a;
}
LL lcm(LL a,LL b)
{
    return a/gcd(a,b)*b;
}
int main()
{
   bin[0]=1; for (int i=1;i<=30;i++) bin[i]=bin[i-1]<<1;
    L=read(); R=read(); n=read();
    for (int i=1;i<=n;i++) a[i]=read();
    sort(a+1,a+n+1);
    for (int i=2;i<=n;i++)
    {
        bool exi=false;
        for (int j=1;j<i;j++) if (a[i]%a[j]==0) { exi=true; break; }
        if (exi) swap(a[i],a[n]),i--,n--;
    }
    ans=R-L+1;
    for (int sta=1;sta<bin[n];sta++)
    {
        int cnt=0; LL tmp=1; bool exi=true;
        for (int i=1;i<=n;i++)
         if (sta&bin[i-1])
          if (R/a[i]>=tmp) tmp*=a[i],cnt++; 
           else { exi=false; break; }
        if (!exi) continue;
        if (cnt&1) ans-=R/tmp-(L-1)/tmp;
         else ans+=R/tmp-(L-1)/tmp;
    }
    printf("%lld",ans);
    return 0;
}

ProblemB: 范围(range)
 

#include<cstdio>
#include<cmath>
using namespace std;
long long A,B;
double a,b,c,ans,ans1,ans2;
int main()
{
	scanf("%lld%lld",&A,&B);
	a=2.0;b=(double)(-2*A);c=(double)(A*A)-B;
	ans=(b*b-4*a*c);
	if(ans<0) printf("No Answer.\n");
	else
	{
		ans1=(-sqrt(ans)-b)/(2*a);
		ans2=(sqrt(ans)-b)/(2*a);
		printf("%.2f %.2f\n",ans1,ans2);
	}
	return 0;
}

ProblemC: 水题(water)
 

#include <iostream>
#include <iomanip>
#include <cctype>
#include <cstdio>
#include <cstdlib>
#include <climits>
#include <ctime>
#include <cstring>
#include <cmath>
#include <string>
#include <algorithm>
#include <vector>
#include <map>
#include <stack>
#include <queue>
#include <set>
using namespace std;
long long read()
{
	long long num = 0;
	char c;
	bool flag = 0;
	while ((c = getchar()) == '\t' || c == '\r' || c == '\n' || c == ' ');
	if (c == '-')
		flag = 1;
	else
		num = c - 48;
	while (isdigit(c = getchar()))
		num = num * 10 + c - 48;
	return (flag ? -1 : 1) * num;
}

int read1()
{
	int num = 0;
	char c;
	bool flag = 0;
	while ((c = getchar()) == '\t' || c == '\r' || c == '\n' || c == ' ');
	if (c == '-')
		flag = 1;
	else
		num = c - 48;
	while (isdigit(c = getchar()))
		num = num * 10 + c - 48;
	return (flag ? -1 : 1) * num;
}

long long ans;

int pos;

void nhh (int row,int lx,int rx)
{
	int k,now;
	if (row != pos)
		{
			now = pos & ~(row | lx | rx);
			while (now)
				{
					k = now & -now;
					now -= k;
					nhh(row + k,(lx + k) << 1,(rx + k) >> 1);
				}
		}
	else
		ans++;
}

bool vis[101];

int cnt;

long long z,prime[101];

void sss(int m)
{
	int i,j;
	for (i = 2;i <= m;i++)
		{
			if (!vis[i])
				prime[++cnt] = i;
			for (j = 1;j <= cnt && prime[j] * i <= m;j++)
				{
					vis[prime[j] * i] = 1;
					if (i % prime[j] == 0)
						break;
				}
		}
}

long long n,f1,f2,t,num[101],num1[101];

int m,i;

int main()
{
	//freopen("water.in","r",stdin);
	//freopen("water.out","w",stdout);
	n = read();
	f1 = 1;
	f2 = 1;
	while (n > f2)
		{
			t = f2;
			f2 += f1;
			f1 = t;	
		}
	if (n < f2)
		{
			m = min(13,read1());
			m = n % m + 1;
			pos = (1 << m) - 1;
			nhh(0,0,0);
			printf("%lld\n",ans);
			fclose(stdin);
			fclose(stdout);
			return 0;
		}
	else
		{
			m = read1();
			sss(m);
			for (i = 1;i <= cnt;i++)
				while (m % prime[i] == 0)
					{
						num[i]++;
						m /= prime[i];
					}
			for (i = 1;i <= cnt;i++)
				{
					z = n;
					while (z)
						{
							num1[i] += z / prime[i];
							z /= prime[i];
						}
				}
			ans = n;
			for (i = 1;i <= cnt;i++)
				if (num[i])
					ans = min(ans,num1[i] / num[i]);
			printf("%lld\n",ans);
			//fclose(stdin);
			//fclose(stdout);
			return 0;
		}
}

ProblemD: 阶乘(factorial)
 

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <iomanip>
#include <algorithm>
#include <string>
#include <climits>
#include <ctime>
#include <queue>
#include <map>
#include <stack>
#include <vector>
using namespace std;
int read()
{
	int num = 0;
	char c;
	bool flag = 0;
	while ((c = getchar()) == '\t' || c == '\n' || c == '\r' || c == ' ');
	if (c == '-')
		flag = 1;
	else
		num = c - 48;
	while (isdigit(c = getchar()))
		num = num * 10 + c - 48;
	return (flag ? -1 : 1) * num;
}
int a[15],u,n,k;
long long ans,t;
int main()
{
	//freopen("factorial.in","r",stdin);
	//freopen("factorial.out","w",stdout);
	n = read();
	k = n - n % 5;
	t = 0;
	if (n < 10)
		{
			if (n == 5)	printf("1\n");
			if (n == 6) printf("2\n");
			if (n == 7) printf("3\n");
			if (n == 8) printf("4\n");
			if (n == 9) printf("5\n");
			return 0;
		}
	for (int i = 10;i <= k;i += 5)
		{
			a[1]++;
			u = 1;
			if (a[1] % 5 == 0)
				{
					while(a[u] == 5)
						{
							a[u++] = 0;
							a[u]++;
						}
				}
			t += u;
			ans += 5 * t;
		}
	a[1]++;
			u = 1;
			if (a[1] % 5 == 0)
				{
					while(a[u] == 5)
						{
							a[u++] = 0;
							a[u]++;
						}
				}
			t += u;
	ans += t * (n % 5 + 1);
	printf("%lld\n",ans);
	//fclose(stdin);
	//fclose(stdout);
}

ProblemE: 面积(area)
 

#include<cstdio>
#include<bits/stdc++.h>
using namespace std;
long long xx1,yy1,xx2,yy2,ans,M,N;
int main()
{
	//freopen("area.in","r",stdin);
	//freopen("area.out","w",stdout);
	while(~scanf("%lld%lld%lld%lld%lld%lld",&M,&N,&xx1,&yy1,&xx2,&yy2))
	{
		ans=abs(xx1*yy2-xx2*yy1);
		if(M*N==ans+2) puts("Yes");
		else puts("No");
	}
	return 0;
} 

ProblemF: 圆(circle)
 

#include<cstdio>
int main()
{
	//freopen("circle.in","r",stdin);
	//freopen("circle.out","w",stdout);
	long long ans,n;
	while(~scanf("%lld",&n))
	{
		ans=(n*(n-1)*(n-2)*(n-3))/24;
		ans+=n*(n-1)/2;
		ans+=1;
		printf("%lld\n",ans);
	}
}

ProblemG: 异或(xor)
 

#include<cstdio>
long long a; 
int main()
{
	//freopen("xor.in","r",stdin);
	//freopen("xor.out","w",stdout); 
	while(~scanf("%lld",&a))
	{
		printf("%lld\n",((a+1)<<1)/3);
	}
} 

ProblemH: 最大公约数(lcm)
 

#include<cstdio>
#include<queue>
using namespace std;
int gcd(int a,int b)
{
    return b==0? a:gcd(b,a%b);
}
int main()
{
    int x,y;
    scanf("%d%d",&x,&y);
    printf("%lld",x*y/gcd(x,y));
    return 0;
}

ProblemI: 区间(interval)
 

#include<cstdio>
long long a[1000001],c[1000001],n,m,l,r,p,q;
int main()
{
	scanf("%lld%lld",&n,&m);
	for(register int i=1;i<=n;i++)
	  scanf("%lld",&a[i]);
	for(register int i=1;i<=m;i++)
	{
		scanf("%lld%lld%lld%lld",&q,&l,&r,&p);
		if(q==1) p=-p;
		c[l]+=p;c[r+1]-=p;
	}
	for(register int i=1;i<=n;i++)
	{
		c[i]+=c[i-1];
		a[i]+=c[i]+a[i-1];
	}
	scanf("%lld%lld",&l,&r);
	printf("%lld\n",a[r]-a[l-1]);
	return 0;
} 

ProblemJ: 时间(time)
 

#include<cstdio>
struct time{
	int h,m;
};
time t[17];
void doit()
{
	int tot=-1;
	t[++tot].h=00;t[tot].m=00;
	t[++tot].h=01;t[tot].m=10;
	t[++tot].h=02;t[tot].m=20;
	t[++tot].h=03;t[tot].m=30;
	t[++tot].h=04;t[tot].m=40;
	t[++tot].h=05;t[tot].m=50;
	t[++tot].h=10;t[tot].m=01;
	t[++tot].h=11;t[tot].m=11;
	t[++tot].h=12;t[tot].m=21;
	t[++tot].h=13;t[tot].m=31;
	t[++tot].h=14;t[tot].m=41;
	t[++tot].h=15;t[tot].m=51;
	t[++tot].h=20;t[tot].m=02;
	t[++tot].h=21;t[tot].m=12;
	t[++tot].h=22;t[tot].m=22;
	t[++tot].h=23;t[tot].m=32;
	t[++tot].h=24;t[tot].m=60;
}
int main()
{
	//freopen("time.in","r",stdin);
	//freopen("time.out","w",stdout);
	int a,b;
	scanf("%d:%d",&a,&b);doit();
	for(register int i=0;i<=15;i++)
	{
		if(a==t[i].h&&b==t[i].m) {printf("%d:%d\n%d:%d",t[i-1].h%24,t[i-1].m%60,t[i+1].h%24,t[i+1].m%60);return 0;} 
	}
	for(register int i=0;i<=15;i++)
	{
		if((a>t[i].h&&a<t[i+1].h)||(a==t[i].h&&b>t[i].m)||(a==t[i+1].h&&b<t[i+1].m)) printf("%d:%d\n%d:%d",t[i].h,t[i].m,t[i+1].h%24,t[i+1].m%60);
	}
} 

猜你喜欢

转载自blog.csdn.net/qq_33241119/article/details/81159855
今日推荐