4 5 6
7 8 9
现在我们把矩阵中的每条边的中点连起来,这样形成了一个新的矩形,请你计算一下这个新的矩形的覆盖的数字的和。比如,n = 3n=3 的时候矩形覆盖的数字如下。
4 5 6
8
那么当 nn 等于 101101 的时候,矩阵和是多少?
我们可以把任意两个在图的在边界上的相同的方格一起消掉,比如把两个4消掉以后,
每次消掉两个方格的时候,都有会获得一个分数,第 i次消的分数为 i× 方格的值。比如上面的消法,是第一次消,获得的分数为 1×4=4。
请你帮忙最优操作情况下,获得的分数最多为多少。
#include <stdio.h>
int pw(int x, int y, int p) {
if (!y) {
return 1;
}
int res = pw(x*x,y>>1,p);
if (y & 1) {
res = res * x % p;
}
return res;
}
int main() {
int x, y, p;
scanf("%d%d%d", &x, &y, &p);
printf("%d\n", pw(x, y, p));
return 0;
}
N! 末尾有多少个 000 呢?
N!=1×2×⋯×NN! = 1 \times 2 \times \cdots \times NN!=1×2×⋯×N。
代码框中的代码是一种实现,请分析并填写缺失的代码。
只需要找到N的阶乘里面有多少个因子5,也就是能被多少个5整除。2和5组成10,2的因子一定比5的因子多。
#include <stdio.h>
int main() {
int n, ans = 0;
scanf("%d", &n);
while (n) {
ans += (n=n/5);
}
printf("%d\n", ans);
return 0;
}
F题:藏宝图
蒜头君得到一张藏宝图。藏宝图是一个 10×1010 \times 1010×10 的方格地图,图上一共有 101010 个宝藏。有些方格地形太凶险,不能进入。
整个图只有一个地方可以出入,即是入口也是出口。蒜头君是一个贪心的人,他规划要获得所有宝藏以后才从出口离开。
#include <stdio.h>
#include <math.h>
int main() {
int aa[500100];
int head=1,cnt=0,x,n;
scanf("%d",&n);
scanf("%d",&aa[1]);
for(int i=2;i<=n;i++)
{
head++;
scanf("%d",&aa[head]);
while(1)
{
if(head==1)
{
break;
}
else if(aa[head]-aa[head-1]==1)
{
cnt++;
head--;
///printf("head=%d %d\n",head,aa[head]);
}
else if(aa[head-1]-aa[head]==1)
{
cnt++;
head--;
aa[head]=aa[head+1];
}
else
{
break;
}
}
}
printf("%d\n",cnt);
return 0;
}
蒜头君喜欢下棋。最近它迷上了国际象棋。国际象棋的棋盘可以被当做一个 8×88\times 88×8 的矩阵,棋子被放在格子里面(不是和中国象棋一样放在线上)。
蒜头君特别喜欢国际象棋里面的马,马的移动规则是这样的:横着走两步之后竖着走一步,或者横着走一步之后竖着走两步。例如,一匹马在 (3,3)(3,3)(3,3) 的位置,则它可以到达的地方有 (1,2)(1,2)(1,2),(2,1)(2,1)(2,1),(1,4)(1,4)(1,4),(4,1)(4,1)(4,1),(5,2)(5,2)(5,2),(2,5)(2,5)(2,5),(5,4)(5,4)(5,4),(4,5)(4,5)(4,5) 八个地方。蒜头君想要把整个棋盘都放上马,并且让这些马不能相互攻击(即任何一匹马不能走一步之后就到达另一匹马的位置)。蒜头君当然知道在 8×88 \times 88×8 的棋盘上怎么放马,但如果棋盘变为 n×mn \times mn×m 的,蒜头君就不懂了。他希望你来帮忙他计算一下究竟能放多少匹马。
输入格式
共一行,两个整数nnn和mmm(1≤n,m≤1000 1 \leq n , m \leq 10001≤n,m≤1000),代表棋盘一共有 nnn 行 mmm 列。
输出格式
输出一个整数,代表棋盘上最多能放的马的数量。
样例输入1
2 4
样例输出1
4
样例输入2
3 4
样例输出2
6
#include <stdio.h>
#include <math.h>
int main() {
int aa[500100];
int head=1,cnt=0,x,n;
scanf("%d",&n);
scanf("%d",&aa[1]);
for(int i=2;i<=n;i++)
{
head++;
scanf("%d",&aa[head]);
while(1)
{
if(head==1)
{
break;
}
else if(aa[head]-aa[head-1]==1)
{
cnt++;
head--;
///printf("head=%d %d\n",head,aa[head]);
}
else if(aa[head-1]-aa[head]==1)
{
cnt++;
head--;
aa[head]=aa[head+1];
}
else
{
break;
}
}
}
printf("%d\n",cnt);
return 0;
}
n和m其中一个等于2的最优放置方法
蒜头君想知道,他最少需要加多少个点使这个数轴变优美。
输入格式
输入第一行为一个整数 n(1≤n≤105)n(1 \leq n \leq 10^5)n(1≤n≤105),表示数轴上的点数。
第二行为 nnn 个不重复的整数 x1,x2,...,xn(−109≤xi≤109)x_1,x_2,...,x_n(-10^9 \leq x_i \leq 10^9)x1,x2,...,xn(−109≤xi≤109),表示这些点的坐标,点坐标乱序排列。
输出格式
输出一行,为一个整数,表示蒜头君最少需要加多少个点使这个数轴变优美。
样例输入
4 1 3 7 15
样例输出
1
蒜头君特别喜欢数学。今天,蒜头君突发奇想:如果想要把一个正整数 nnn 分解成不多于 kkk 个正整数相加的形式,那么一共有多少种分解的方式呢?
蒜头君觉得这个问题实在是太难了,于是他想让你帮帮忙。
输入格式
共一行,包含两个整数 n(1≤n≤300)n(1 \leq n \leq 300)n(1≤n≤300) 和 k(1≤k≤300)k(1 \leq k \leq 300)k(1≤k≤300),含义如题意所示。
输出格式
一个数字,代表所求的方案数。
样例输入
5 3
样例输出
5
#include <stdio.h>
int main()
{
long long dp[350][350];
dp[0][0]=1;
for(int i=1;i<=300;i++)
dp[i][1]=1;
for(int i=2;i<=300;i++)
{
for(int j=2;j<=i;j++)
{
dp[i][j]=dp[i][j-1];
if(j>i-j)
dp[i][j]+=dp[i-j][i-j];
else
dp[i][j]+=dp[i-j][j];
}
}
long long n,m;
scanf("%lld%lld",&n,&m);
if(m>n)
m=n;
printf("%lld\n",dp[n][m]);
return 0;
}