A:
很容易发现求的就是一个N!
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long int ll;
const int maxn = 1e5 + 10;
const ll mod = 1e9 + 7;
void solved(){
int n;cin>>n;
ll ans = 1;
for(int i = n; i >= 2; i--){
ans = ans * i % mod;
}
cout<<ans<<endl;
}
int main(){
solved();
return 0;
} B:
贪心。
可以先求一波所有数的和,然后从小到大修改,sum - 这个数 + 9,一直循环,直到sum >= m退出循环输出答案即可。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long int ll;
const int maxn = 1e6 + 10;
ll a[maxn];
void solved(){
ll n,m;cin>>n>>m;
for(int i = 1; i <= n; i++)cin>>a[i];
sort(a + 1, a + 1 + n);
ll sum = 0;
for(int i = 1; i <= n; i++)sum += a[i];
int pos = 1;
int cnt = 0;
while(sum < m){
sum -= a[pos++];
sum += 9;
cnt ++;
}
cout<<cnt<<endl;
}
int main(){
solved();
return 0;
} C:
场上没想出来,但是也89不离十了,最后没出有点可惜。
这题不会做的情况下可以写一个暴力骗分。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long int ll;
const int maxn = 1e5 + 10;
ll mod = 1e9 + 7;
ll n;
bool g[100][100];
bool vis[maxn];
int path[100];
int cnt ;
void dfs(int dep){
if(dep >= n){
for(int i = 0 ; i < dep; i++){
// cout<<path[i]<<" ";
g[i + 1][path[i]] = 1;
}
//cout<<endl;
bool flag = false;
for(int i = 1; i <= n; i++){
for(int j = 1; j <= n; j++){
if(g[i][j] && !g[j][i]){
flag = true;
}
}
}
memset(g,false,sizeof(g));
if(!flag)cnt++;
}
for(int i = 1; i <= n; i++){
if(!vis[i]){
vis[i] = true;
path[dep] = i;
dfs(dep + 1);
vis[i] = false;
}
}
}
void solved(){
cin>>n;
dfs(0);
cout<<cnt<<endl;
}
int main(){
solved();
return 0;
}如果擅长找规律的大佬,根据前面几项就可以推出公式,然后弱菜的我并不能。
接下来是这题的正解:
注意到要使得横竖都相等,只能45度直线斜对角线填,当我们填在(1,1)那么第一行第一列不能再填写任何数,那么就是要在(n-1,n-1)填,填法与刚才一样。当我们不填在(1,1),我们还有(n-1)个选择去填写(一次填两,对称),但是每当我们填完两个还剩下(n-2,n-2)个格子要填写(填完两损失两行两列),然后这(n-2,n-2)格子填法与之前一样,所以我们能够得到递推式:f(n) = f(n - 1) + (n - 1) * f(n - 2)。
这里偷个图
代码:
#include<bits/stdc++.h>
using namespace std;
const int mod = 1e9 + 7;
typedef long long int ll;
const int maxn = 1e5 + 10;
ll f[maxn];
void solved(){
int n;cin>>n;
f[1] = 1;f[2] = 2;
for(int i = 3; i <= n; i++)
f[i] = (f[i - 1] + (i - 1) * f[i - 2] % mod) % mod;
cout<<f[n]<<endl;
}
int main(){
solved();
return 0;
}
京公网安备 11010502036488号