TD
题目描述
运行代码
#include <iostream>
#include<iomanip>
#include<algorithm>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
cout << fixed << setprecision(12) << static_cast<double>(n) / m << endl;
return 0;
}
代码思路
fixed
和setprecision(12)
结合使用,设置输出的浮点数格式为固定小数点位数的形式,这里设置为保留 12 位小数。static_cast<double>(n)
将整数n
强制转换为双精度浮点数,然后除以m
,得到一个浮点数结果。
你好,这里是牛客竞赛
题目描述
运行代码
#include <stdio.h>
#include <string.h>
int main() {
int t;
scanf("%d", &t);
while (t--) {
char s[101];
scanf("%s", s);
if ((strncmp(s, "https://www.nowcoder.com", 24) == 0 || strncmp(s, "www.nowcoder.com ", 16) == 0)) {
puts("Nowcoder");
} else if ((strncmp(s, "https://ac.nowcoder.com", 23) == 0 || strncmp(s, "ac.nowcoder.com ", 15) == 0)) {
puts("Ac");
} else {
puts("No");
}
}
return 0;
}
代码思路
- 使用
strncmp
函数进行字符串比较判断:strncmp(s,"https://www.nowcoder.com",24)==0 || strncmp(s,"www.nowcoder.com ",16)==0
:判断输入的字符串s
是否以"https://www.nowcoder.com"
开头(比较前 24 个字符)或者以"www.nowcoder.com "
开头(比较前 16 个字符)。如果满足其中一个条件,说明这个字符串与特定的 “Nowcoder” 相关的网址格式匹配。strncmp(s,"https://ac.nowcoder.com",23)==0 || strncmp(s,"ac.nowcoder.com ",15)==0
:类似地,判断输入的字符串s
是否以"https://ac.nowcoder.com"
开头(比较前 23 个字符)或者以"ac.nowcoder.com "
开头(比较前 15 个字符)。如果满足其中一个条件,说明这个字符串与特定的 “Ac” 相关的网址格式匹配。
- 如果上述条件都不满足,则输出
"No"
,表示输入的字符串不符合特定的网址格式。
strncmp
函数用于比较两个字符串的前n
个字符。如果两个字符串的前n
个字符相同,则返回 0;如果第一个字符串小于第二个字符串,则返回一个负数;如果第一个字符串大于第二个字符串,则返回一个正数。- 通过这种方式,可以快速判断输入的字符串是否符合特定的网址格式,从而输出相应的结果。整个程序的目的是根据输入的字符串是否与特定的网址格式匹配,输出对应的标识。
小红的数组回文值
题目描述
运行代码
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define int long long
const int MOD = 1e9 + 7;
const int N = 1e5 + 10;
int fact[N], infact[N];
int qp(int a, int n) {
int res = 1;
while (n) {
if (n & 1)
res = res * a % MOD;
n >>= 1, a = a * a % MOD;
}
return res;
}
int inv(int x) { return qp(x, MOD - 2); }
int comb(int a, int b) {
if (a < 0 || b < 0 || a < b)
return 0;
return fact[a] * infact[b] % MOD * infact[a - b] % MOD;
}
int __comb(int a, int b) {
if (a < 0 || b < 0 || a < b)
return 0;
int res = infact[b];
for (int i = 0; i < b; i++)
res = res * (a - i) % MOD;
return res;
}
int norm(int x) { return (x % MOD + MOD) % MOD; }
void Prework(int n = N - 10) {
fact[0] = 1;
for (int i = 1; i <= n; i++) {
fact[i] = fact[i - 1] * i % MOD;
}
infact[n] = qp(fact[n], MOD - 2);
for (int i = n; i >= 1; i--) {
infact[i - 1] = infact[i] * i % MOD;
}
}
void Solve() {
int n;
cin >> n;
vector<int> a(n + 1);
for (int i = 1; i <= n; i++)
cin >> a[i];
vector dp(n + 1, vector<int>(n + 1));
vector<int> p(n + 1, 1);
for (int i = 1; i <= n; i++)
p[i] = p[i - 1] * 2 % MOD;
int res = 0;
for (int i = 2; i <= n; i++) {
for (int j = 1; j + i - 1 <= n; j++) {
int l = j, r = j + i - 1;
int x = l - 1, y = n - r;
if (a[l] != a[r]) {
res = (res + p[r - l - 1] * comb(x + y, x) % MOD) % MOD;
}
}
}
cout << res << endl;
}
signed main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int T = 1;
Prework();
while (T--)
Solve();
}
代码思路
一、整体思路
- 预计算阶乘和逆阶乘:通过
Prework
函数预先计算出从 0 到N - 10
(默认值,可根据需要调整)的阶乘和逆阶乘,以便后续快速计算组合数。 - 输入与处理:读入整数
n
,表示序列的长度。读入一个长度为n + 1
的序列a
。定义一个二维向量dp
和一个长度为n + 1
的向量p
,并初始化p
的每个元素为 1,后续用于计算 2 的幂次方。 - 双重循环计算结果:外层循环遍历区间长度
i
从 2 到n
。内层循环遍历起始位置j
,使得j + i - 1 <= n
,确定一个区间。对于每个区间,计算区间左右端点l
和r
,以及对应的x = l - 1
和y = n - r
。如果区间左右端点对应的值a[l]
和a[r]
不相等,则计算组合数comb(x + y, x)
,并与p[r - l - 1]
相乘后累加到结果res
中,同时对结果取模防止溢出。 - 输出结果:最终输出计算得到的结果
res
。
二、主要函数原理
qp
函数(快速幂):采用二进制快速幂算法计算a
的n
次幂。通过不断将指数n
二进制拆分,在每次拆分过程中,如果当前位为 1,则将结果累乘当前的底数a
,底数a
则通过自乘不断更新。这样可以在对数时间内计算出幂次结果。inv
函数(求逆元):利用费马小定理,即当MOD
为质数时,a
的逆元为a^(MOD - 2)
。调用qp
函数计算x
在模MOD
下的逆元。comb
函数(计算组合数):根据组合数的定义,组合数C(a, b)
等于a! / (b! * (a - b)!)
。这里通过预先计算好的阶乘和逆阶乘来快速计算组合数。先判断传入的参数是否合法,如果不合法则返回 0。否则,利用预计算的结果计算组合数,即fact[a] * infact[b] % MOD * infact[a - b] % MOD
。__comb
函数(另一种计算组合数的方式):同样是计算组合数,这里采用了另一种方法。先计算infact[b]
,然后通过循环不断乘以(a - i)
,最后得到组合数结果。norm
函数(规范化结果):确保结果在模MOD
下为非负数。如果结果小于 0,则加上MOD
使其变为非负数,然后再对MOD
取模。Prework
函数(预计算阶乘和逆阶乘):首先初始化fact[0]
为 1。然后通过循环计算从 1 到n
的阶乘,即fact[i] = fact[i - 1] * i % MOD
。接着从后往前计算逆阶乘,先计算infact[n]
为fact[n]
的逆元,然后通过循环计算infact[i - 1]
为infact[i] * i % MOD
。Solve
函数(解决问题):读入数据后,通过双重循环遍历不同的区间。对于每个区间,如果左右端点的值不相等,则计算组合数和 2 的幂次方,累加到结果中。最后输出结果。