Problem A: pigofzhou的巧克力棒
Description
Input
输入数据为T组(T <= 10000),每组数据读入一个n(n<=1000000000)
Output
一行一个整数代表能获得的最大高兴值
Sample Input
Sample Output
#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的因子),下面给你一个n,n!表示zhazhahe的脑残值。
Input
输入一个正整数t(0<t<3000)表示样例组数,每组样例输入一个正整数n(0<n<1e18),n!表示zhazhahe的脑残值
Output
输出一个正整数表示zhazhahe二的程度
Sample Input
Sample Output
首先 关于查找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
Sample Output
#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
Input
Output
Sample Input
Sample Output
Problem G: 神偷TMK后续
Description
Input
Output
Sample Input
Sample Output
#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;
}
Problem J: 质方数
Description
小z很喜欢研究各种各样的数字,最近他迷上了质数和平方数,他把一个质数的平方命名为”质方数”,现在他想知道,给出一个正整数,距离这个正整数最近的质方数是什么?(如果有2个距离相等的质方数,选择较小的一个)
Input
输入数据组数为T(T<=50),每组数据输入一个正整数n,其中1<=n<=100,000,000;
Output
对于每个测试样例,输出距离最近的质方数,每个样例占一行。
Sample Input
Sample Output
#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);
}
}
}