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