第一题
给定三个正整数 a,b,c,请你计算并输出 2a+3b+5c的值。
输入格式
共一行,包含三个正整数 a,b,c。
输出格式
一个整数,表示答案。
数据范围前 3个测试点满足 1≤a,b,c≤10。
所有测试点满足 1≤a,b,c≤1000。
输入样例:
1 2 3
输出样例:
23
Ans:签到题,没什么好说的
// ans1
#include<iostream>
using namespace std;
int main()
{
int a,b,c;
cin >> a >> b >> c;
cout << 2*a+3*b+5*c;
}
第二题
贝茜经营的牛棚旅店中有 a个可供一头牛入住的小牛栏和 b个可供两头牛入住的大牛栏。
初始时,所有牛栏都是空的。
已知,今天一共有 n波奶牛依次前来入住,每波由 1∼2头奶牛组成。
如果是一头奶牛前来入住,那么:
如果有空着的小牛栏,则安排其在空着的小牛栏入住。
如果没有空着的小牛栏,则安排其在空着的大牛栏入住。
如果既没有空着的小牛栏,也没有空着的大牛栏,则安排其在仍未住满的大牛栏入住。
如果上述都没有,则将其劝离。
如果是两头奶牛前来入住,那么:
如果有空着的大牛栏,则安排它们在空着的大牛栏入住。
如果没有空着的大牛栏,则将它们劝离。
请你计算,一共有多少头奶牛会被劝离。
注意,问题是被劝离的奶牛具体数量,而不是波数。
输入格式
第一行包含三个整数 n,a,b。
第二行包含 n 个整数 t1,t2,…,tn,其中 ti 表示第 i 波奶牛的数量。
输出格式
一个整数,表示被劝离的奶牛的具体数量。
数据范围
前 3个测试点满足 1≤n≤5。
所有测试点满足 1≤n≤2×105,1≤a,b≤2×105,1≤ti≤2。
输入样例1:
4 1 2
1 2 1 1
输出样例1:
0
输入样例2:
4 1 1
1 1 2 1
输出样例2:
2
Ans:模拟题,重点是定义变量c来记录大牛棚仅仅住了一只羊的情况
#include<iostream>
using namespace std;
int main()
{
int n,a,b,c;
c = 0;
int ans = 0;
cin >> n >> a >> b;
for(int i = 1;i <= n;++i){
int temp;
cin >> temp;
if(temp == 1){
if(a>0){
a--;
}
else{
if(b>0){
c++;
b--;
}
else{
if(c>0) c--;
else ans++;
}
}
}
else{
if(b>0) b--;
else ans = ans+2;
}
}
cout << ans;
}
第三题
我们希望构造一个 n×m的整数矩阵。
构造出的矩阵需满足:
每一行上的所有元素之积均等于 k。
每一列上的所有元素之积均等于 k。
保证 k为 1或 −1。
请你计算,一共可以构成出多少种不同的满足条件的矩阵。
由于结果可能很大,你只需要输出对 109+7取模后的结果。
输入格式
共一行,包含三个整数 n,m,k。
输出格式
一个整数,表示对 109+7取模后的结果。
数据范围
前 3个测试点满足 1≤n,m≤3。所有测试点满足 1≤n,m≤1018,k为 1或 −1。
输入样例1:
1 1 -1
输出样例1:
1
输入样例2:
1 3 1
输出样例2:
1
输入样例3:
3 3 -1
输出样例3:
16
Ans:(找规律的问题!!!)对于nm的矩阵,当以(0,0)为矩阵顶点从该矩阵分离出一个(n-1)(m-1)的矩阵后。认为剩下的一行和一列的元素可以被确定,并且该(n-1)*(m-1)的矩阵中元素可以任意填写。所以所有符合条件的矩阵数量为2(n-1)*(m-1)。另外需要注意的是:当k=-1时,当n与m奇偶性不同时,该矩阵无解。
eg:由于答案很大,需要对 109+7取模:使用欧拉定理(或费马小定理)来解决:
假如 a 是一个整数, p 是一个质数,那么 ap-a 是 p 的倍数,也可以表示为 ap equiv a (mod p) 。但如果 a 不是 p 的倍数的话(就是这两个数互质),这个定理可以改写成我们常看的形式: ap-1 equiv 1 (mod p) 。
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int p = 1e9 + 7;
ll qmi(ll a,ll b,ll p){%%快速幂算法
ll res = 1;
while(b)
{
if(b & 1) res = res * a % p;
a = a * a % p;
b >>= 1;
}
return res;
}
int main(){
ll n,m,k;
cin >> n >> m >> k;
if(k == -1 && n%2 != m%2) cout << "0" << endl;
else{
cout << qmi(qmi(2, n - 1, p), m - 1, p) << endl;%%必须使用两次快速幂,直接2^(n-1)*(m-1)依旧会爆ll
}
return 0;
}