Contest1051 - 2016广东工业大学新生杯决赛网络同步赛暨全国新生邀请赛

Problem A: pigofzhou的巧克力棒

Description

众所周知,pigofzhou有许多妹子。有一天,pigofzhou得到了一根巧克力棒,他想把这根巧克力棒分给他的妹子们。具体地,这根巧克力棒长为 n,他想将这根巧克力棒折成 n 段长为 1 的巧克力棒,然后分给妹子们。
但是他妹子之一中的 15zhazhahe 有强迫症。若它每次将一根长为 k 的巧克力棒折成两段长为 a 和 b 的巧克力棒,此时若 a=b,则15zhazhahe会得到一点高兴值。
pigofzhou想知道15zhazhahe最多能获得多少高兴值。

Input


输入数据为T组(T <= 10000),每组数据读入一个n(n<=1000000000)

Output

一行一个整数代表能获得的最大高兴值

Sample Input

15

Sample Output

3
#include<stdio.h>
long long n;
long long gs(long long n)
{
    long long num=0;
    while(n)
    {
        num+=n/2;
        n/=2;
    }
    return num;
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%lld",&n);
        printf("%lld\n",gs(n));
    }
     return 0;
}

Problem B: Zhazhahe究竟有多二

Description

Zhazhahe竟然能二到把耳机扔到洗衣机里去洗,真的是二到了一种程度,现在我们需要判断一下zhazhahe二的程度(就是计算zhazhahe的脑残值有几个2的因子),下面给你一个nn!表示zhazhahe的脑残值。

Input

输入一个正整数t(0<t<3000)表示样例组数,每组样例输入一个正整数n(0<n<1e18)n!表示zhazhahe的脑残值

Output

输出一个正整数表示zhazhahe二的程度

Sample Input

32415

Sample Output

1311
ps:关于这题 数学不好就真的只能找规律了。
首先 关于查找n!中k的因子是有数学公式的:
n!=n*(n-1)(n-2)……3*2*1
=(k*2k*3k…..*mk)*a a是不含因子k的数的乘积,显然m=n/k;
=(k^m)*(1*2*3…*m)*a
=k^m*m!*a
比如说例子代码:
int gs(int n,int k)
{
    int num=0;
    while(n)
    {
        num+=n/k;
        n/=k;
    }
    return num;
}
下面代码:
#include<stdio.h>
long long n;//数据比较大 
long long gs(long long n)
{
    long long num=0;
    while(n)
    {
        num+=n/2;
        n/=2;
    }
    return num;
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%lld",&n);
        printf("%lld\n",gs(n));
    }
     return 0;
}//这题和A题代码一样;调试的时候发现的

Problem C: 剁手女生节

Description

由于女生节准备到了,ming打算给班上女生送一份大礼。没错,就是数学练习册!
ming先前就已经收藏了 n 本练习册了,一直不舍得做,这次突然决定把它们都拿出来当作礼物送出去!
但是,ming班上一共有 4 个女生,为了不要显得自己偏爱哪一个,他觉得每个女生都应该分到同等数量的练习册。
这样的话,原来的 n 本就可能不太够了。于是他去逛亚马当商城。
他发现,最近ACM(Association of Counting Method)又出版了好多新版数学练习册:高数、线代、离散、概率论…
而且商店有三种促销优惠套餐:
第一种:任选 1 本练习册,送欧几里德主题套尺。只需 a 个比特币;
第二种:任选 2 本练习册,送莱布尼兹同款2B铅笔。只需 b 个比特币;
第三种:任选 3 本练习册,送爱因思坦专用橡皮擦。只需 c 个比特币。
那么问题来了:吃土ming如何用最少的比特币购买若干本练习册,使得全部(包括原来的n本)可以平分给四个女生?

Input

每组输入是一行四个整数:n,a,b,c(1 <= n,a,b,c <= 1e9)意思如题目描述。

Output

对每组输入,输出一行一个整数,表示ming要花的最少的比特币数。

Sample Input

31 1 3 46 2 1 14 4 4 4

Sample Output

310
s=4-n%4;s是最后需要买的书的数量;
#include<stdio.h>
#include<algorithm>
using namespace std;
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        long long int n,a,b,c;
        scanf("%lld%lld%lld%lld",&n,&a,&b,&c);
        long long int s=4-n%4;
        if(s==4)
            printf("0\n");
        else
        {
            long long int k;
            if(s==3)
                k=min(min(a*3,(a+b)),c);
            else if(s==2)
                k=min(min(2*a,b),c*2);
            else
                k=min(min(a,c*3),c+b);
            printf("%lld\n",k);
        }
    }
            return 0;
}

Problem F: 神偷TMK

Description

TMK十分喜欢打CS,据说GDUTACM新生杯的一等奖的奖品的星际CS的真人CS游戏团体券,他毅然报了名。 然而TMK等不及决赛的来临,希望能早日可以玩真人CS。于是TMK打算把真人CS游戏团体券从师兄那里偷出来。 几听打探,TMK发现真人CS游戏团体券锁在了工一730的保险箱里面。但是他不知道密码。他突然想起了yfq给了他一个锦囊,当有困难的时候打开来看。 锦囊里面的纸条上有一串小写字母"abhcujzqacehbfjkbacxmcnjkaecfiallcxcbbcad",TMK灵机一动,密码应该是这串字母出现最多的字母和第二多的字母按字典序连接在一起吧。于是TMK在密码箱上按下了那两个字母,那么现在问那两个字母是什么

Input

Output

按字典序输出这串字母出现最多的字母和第二多的字母,中间无空格。

Sample Input

Sample Output

ps:小学生的水题。就不发代码了

Problem G: 神偷TMK后续

Description

TMK十分喜欢打CS,据说GDUTACM新生杯的一等奖的奖品的星际CS的真人CS游戏团体券,他毅然报了名。 然而TMK等不及决赛的来临,希望能早日可以玩真人CS。于是TMK打算把真人CS游戏团体券从师兄那里偷出来。 几听打探,TMK发现真人CS游戏团体券锁在了工一730的保险箱里面。但是他不知道密码。他突然想起了yfq给了他一个锦囊,当有困难的时候打开来看。 锦囊里面的纸条上有一串小写字母"abhcujzqacehbfjkbacxmcnjkaecfiallcxcbbcad",TMK灵机一动,密码应该是这串字母出现最多的字母和第二多的字母按字典序连接在一起吧。于是TMK在密码箱上按下了那两个字母,保险箱开了。 TMK发现里面有n张星际CS的真人CS游戏团体券,但tmk只想拿k张,因为tmk觉得拿太多就会没时间学习了。 现在问TMK一共有多少种取法

Input

题目包含多组数据,每组测试数据包含一行,两个数n和k(1<=n<=10,0<=k<=n)

Output

每组测试数据包含一个整数表示TMK的取法

Sample Input

3 23 0

Sample Output

31

#include<stdio.h>
#include<algorithm>
using namespace std;
int main()
{
    int n,k;
    while(~scanf("%d%d",&n,&k))
    {
        int a=1,b=1,c=1;//一定要赋值1;
    for(int i=n;i>=1; i--)
        a*=i;
    for(int i=k; i>=1; i--)
        b*=i;
    for(int i=(n-k); i>=1; i--)
        c*=i;
    printf("%d\n",a/(b*c));
    }
    return 0;
}

ps:读完这题你会发现这是排列组合;很简单

Problem J: 质方数

Description

小z很喜欢研究各种各样的数字,最近他迷上了质数和平方数,他把一个质数的平方命名为”质方数”,现在他想知道,给出一个正整数,距离这个正整数最近的质方数是什么?(如果有2个距离相等的质方数,选择较小的一个)

Input

输入数据组数为T(T<=50),每组数据输入一个正整数n,其中1<=n<=100,000,000;

Output

对于每个测试样例,输出距离最近的质方数,每个样例占一行。

Sample Input

238

Sample Output

49
#include<stdio.h>
#include<math.h>
bool f(int n)
{

	if(n==2)
		return true;
	else
	{
		for(int i=2;i<=sqrt(double(n));i++)
		{
			if(n%i==0)
				return false;
		}
	}
	return true;
}
int main()
{
	int n;
	scanf("%d",&n);
	while(n--)
	{
		int m;
		scanf("%d",&m);
		int c;
		int count1;
			int count2;
		if(m<2)
		{
			if(m==0)
			printf("2 2\n");
			if(m==1)
			printf("2 1\n");
		}
		else
		{
			int x=m;
			int y=m;
			while(x--)
				if(f(x))
				{
					count1=m-x;
					break;
				}
			while(y++)
				if(f(y))
				{
					count2=y-m;
					break;
				}
			if(count1<=count2)
			{
				m=x;
				c=count1;
			}
			else
			{
				m=y;
				c=count2;
			}
			printf("%d\n",m*m);
		}
	}
}
ps:直接把nyoj自己做得代码带过来改了一下;
-------------------------------------------未完待续

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值