目测本月没有cf了,明天下午没课,补一场cf吧
n层楼梯,一次可以走1步或2步,要使总步数为m的倍数,求最少走多少步。 列方程联立,枚举
#include <cstdio>
int main() {
int n, m;
scanf("%d%d", &n, &m);
for (int i = m; i <= n; i += m) {
if (2*i-n >= 0) {
printf("%d\n", i);
return 0;
}
}
printf("-1\n");
return 0;
}
给一个只有'+','-'的序列,第二个序列含有‘+’,‘-’,‘?’,‘+'代表向前走,'-'代表向后走,’?‘有50%的概率向前,%50向后,求零点分别执行两个序列,求终点一样的概率
#include <cstdio>
#include <math.h>
#include <cstring>
const int N = 20;
char A[1000], B[1000];
int a[N][N];
void init() {
a[0][0] = a[1][1] = a[1][0] = 1;
for (int i = 2; i < N; i++)
for (int j = 0; j <= i; j++)
a[i][j] = a[i-1][j] + a[i-1][j-1];
}
int main() {
init();
scanf("%s%s", A, B);
int add = 0, sub = 0;
int len = strlen(A);
for (int i = 0; i < len; i++) {
if (A[i] == '+') add++;
if (A[i] == '-') sub++;
}
for (int i = 0; i < len; i++) {
if (B[i] == '+') add--;
if (B[i] == '-') sub--;
}
if (add < 0 || sub < 0) {
printf("0.0000000000000\n");
return 0;
}
if (add == 0 && sub == 0) {
printf("%.12f\n", 1.0000000000);
return 0;
}
int what = add + sub;
double ans = a[what][add]*1.0/(pow(2, what)*1.0);
printf("%.12f\n", ans);
return 0;
}
给定a,b。求有多少个x,使x满足:x/b / x%b == k 且 a >= k>=1
题解: 设x/b = u, x%b = w, 则:1->x = b*u + w 由 x/b / x%b == k有:u/w = k, 即u = k*w带入1中 : x = b*k*w + w w的取值范围为[0,b-1], x = b*(b-1)/2*(b*k+1),枚举k从1到a就好了(直接O(1)把方程解出来也行)
#include <cstdio>
const int MOD = (int) 1e9+7;
typedef long long LL;
int main() {
__int64 a, b;
scanf("%I64d%I64d", &a, &b);
if (b == 1) {
printf("0\n");
return 0;
}
LL ans = 0;
for (LL i = 1; i <= a; i++) {
ans = (ans + b*(b-1)/2%MOD * ((1+i*b) %MOD) )% MOD;
}
printf("%I64d\n", ans%MOD);
return 0;
}
给出n,k。求出n个集合,每个集合含有4个元素,所有集合中的元素不重复,且在同一集合中,任意两个元素的最大公约数为k
构造(from九野):1 2 3 5 这样一个最小的且互素的集合,如果要求多个就每个元素+6(贪心,加最小不重复的),输出的时候每个元素*k
#include <cstdio>
#include <vector>
using namespace std;
#define pb push_back
const int q = 6;
vector<int>G[10000];
void init(int x) {
G[x].clear();
if (x == 1) {
G[x].pb(1);
G[x].pb(2);
G[x].pb(3);
G[x].pb(5);
}
else {
G[x].pb(G[x-1][0]+q);
G[x].pb(G[x-1][1]+q);
G[x].pb(G[x-1][2]+q);
G[x].pb(G[x-1][3]+q);
}
}
int main() {
int n, m;
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++)
init(i);
printf("%d\n", G[n][3]*m);
for (int i = 1; i <=n; i++) {
for (int j = 0; j < G[i].size(); j++) {
printf("%d ", G[i][j]*m);
}
puts("");
}
return 0;
}