A.Letter Song ~ 致十年后的我们

题目要求的是,在一个标准输出中,修改其中的一个部分,其他它的保持不变,因此,可以联想到字符串。对于修改字符串中的某一个元素,进行重新赋值。
代码一:字符串
#include<iostream>
#include<string>
using namespace std;
int main()
{
string str;
cin>>str;
str[2]+=1;
cout<<str;
return 0;
}
字符串方法较为简单,也利于理解,便于对答案进行求解。
代码二:数字
#include<iostream>
#include<string>
#include<cstdio>
using namespace std;
int main()
{
int year,mouth,day;
scanf("%d-%d-%d",&year,&mouth,&day);
printf("%d-%02d-%02d",year+10,mouth,day);
}
代码很奇妙,直接利用int来存储数据,并且对年份直接处理,在年份后直接加10,格式化输出,得出最后答案。
对于%02d的解释:
在 C++ 中,`printf` 函数的格式化输出中,`%02d` 是一个格式说明符,用于控制整数的输出格式。具体来说:
- `%` 是格式说明符的开始。
- `0` 表示如果数字的位数不足时,前面用零填充。
- `2` 表示输出的最小宽度为 2 位。
- `d` 表示输出的是一个十进制整数。
### 例子
1. **输出小于 10 的数字**:
- 如果 `mm` 或 `dd` 是 5,使用 `%02d` 输出时,会显示为 `05`。
- 如果 `mm` 或 `dd` 是 12,使用 `%02d` 输出时,会显示为 `12`。
2. **输出大于等于 10 的数字**:
- 如果 `mm` 或 `dd` 是 10,使用 `%02d` 输出时,会显示为 `10`。
- 如果 `mm` 或 `dd` 是 20,使用 `%02d` 输出时,会显示为 `20`。
### 为什么使用 `%02d`
在日期格式中,通常希望月份和日期都是两位数,以便于保持格式的一致性。例如,日期 `2023-5-3` 在某些情况下可能会被格式化为 `2023-05-03`,这样更易于阅读和处理。
### 总结
使用 `%02d` 可以确保输出的数字始终是两位数,前面用零填充,从而使输出格式更加整齐和一致。在处理日期和时间等场景时,这种格式非常常见。
代码三:数字+字符串
#include<iostream>
#include<string>
#include<cstdio>
using namespace std;
int main()
{
int year;
string str;
cin>>year;
cin>>str;
year+=10;
cout<<year<<str;
}
利用前面输入整型变量,后边输入字符串,从而轻松对题目进行求解,直接对前面整型进行处理,后面字符串照常输出,相当精细。
B:简单图形问题

题目描述:
需要判断的是给出一个面积是正方形,还是等边三角形,或者都不是,输出对应的值。根据对于正方形来说,一个数满足平方数时,就可以知道它一定是个正方形;而对于等边三角形来说,我求面积公式(如下图),边长为2a,则求出的面积带根号的,而题目给出的是整数,所以不可能是等边三角形,也不可能两者都是所以直接排除两种情况。只需要考虑是或者不是三角形就可以了。
代码一:
#include<iostream>
#include<math.h>
using namespace std;
int main()
{
int n;
cin>>n;
while(n--){
int a;
cin>>a;
int b=sqrt(a);
if(b*b==a)
cout<<"0"<<endl;
else
cout<<"3"<<endl;
}
return 0;
}
代码如上,利用sqrt函数直接判断平方数,从而快速得到需要的答案。
c:小红的机器人构造 - Ⅰ+Ⅱ+Ⅲ



代码:(来源@princeseven)
#include<iostream>
using namespace std;
const int N=1e9+7;
typedef long long ll;
ll n,t,x,y,i,l,r,d,u,f[100001];char s[100002];
ll qmi(ll a){
ll ans=1,n=N-2;
while(n){
if(n%2)ans=ans*a%N;
a=a*a%N;n/=2;
}return ans;
}
ll C(ll m,ll n){return f[n]*qmi(f[m])%N*qmi(f[n-m])%N;}
int main(){cin>>t;f[0]=1;
for(i=1;i<100001;i++)f[i]=i*f[i-1]%N;
while(t--){l=r=d=u=0;
cin>>n>>x>>y>>s;
for(i=0;i<n;i++)
if(s[i]=='L')l++;
else if(s[i]=='R')r++;
else if(s[i]=='D')d++;
else u++;
if(u<x||d<-x||r<y||l<-y)cout<<"NO\n";
else{
cout<<"YES ";int x1=x,y1=y,l1=l,r1=r,u1=u,d1=d;
for(i=0;i<n;i++){
if(s[i]=='L')if(l-r>-y)l--;else cout<<s[i],y++,l--;
else if(s[i]=='R')if(r-l>y)r--;else cout<<s[i],y--,r--;
else if(s[i]=='D')if(d-u>-x)d--;else cout<<s[i],x++,d--;
else if(s[i]=='U')if(u-d>x)u--;else cout<<s[i],x--,u--;
}x=x1,y=y1,l=l1,r=r1,u=u1,d=d1;
cout<<" "<<C(y<0?r-y:l+y,l+r)*C(x<0?u-x:d+x,d+u)%N<<"\n";
}
}
}
算法模块分析:
这段代码实现了快速幂算法(Exponentiation by Squaring),用来计算 \( a^{n} \mod N \),其中 \( n \) 是一个非负整数。下面是对代码的逐行解释:
### 代码分析
```cpp
ll qmi(ll a) {
ll ans = 1, n = N - 2; // 初始化 ans 为 1,n 为 N-2
while (n) { // 当 n 不为 0 时循环
if (n % 2) // 如果 n 是奇数
ans = ans * a % N; // 更新 ans
a = a * a % N; // 将 a 平方并取模
n /= 2; // n 除以 2
}
return ans; // 返回结果
}
```
### 详细解释
1. **参数和返回值**:
- `ll qmi(ll a)`:这是一个函数,接受一个参数 `a`,返回一个 `ll` 类型的结果(通常是 `long long`)。
- `N` 是一个全局常量,表示模数。
2. **初始化**:
- `ll ans = 1`:初始化结果为 1,因为任何数的 0 次方都是 1。
- `ll n = N - 2`:将 `n` 初始化为 `N - 2`,表示我们要计算 \( a^{N-2} \mod N \)。
3. **快速幂算法**:
- `while (n)`:当 `n` 不为 0 时,继续进行循环。
- `if (n % 2)`:检查 `n` 是否为奇数。如果是奇数,则将当前的 `a` 乘到 `ans` 上。
- `ans = ans * a % N`:更新 `ans`,并取模 `N` 以防止溢出。
- `a = a * a % N`:将 `a` 平方,并取模 `N`。这一步是快速幂的关键,可以将指数减半。
- `n /= 2`:将 `n` 除以 2,继续处理下一位。
4. **返回结果**:
- `return ans`:返回计算的结果。
### 例子
假设 \( N = 7 \) 和 \( a = 3 \),那么函数 `qmi(3)` 将计算 \( 3^{5} \mod 7 \)(因为 \( N - 2 = 5 \))。
- **步骤**:
- \( n = 5 \)(奇数),所以 \( ans = 1 \times 3 \mod 7 = 3 \)
- \( a = 3 \times 3 \mod 7 = 2 \)(平方)
- \( n = 2 \)(偶数),不更新 `ans`
- \( a = 2 \times 2 \mod 7 = 4 \)(平方)
- \( n = 1 \)(奇数),所以 \( ans = 3 \times 4 \mod 7 = 5 \)
- \( a = 4 \times 4 \mod 7 = 2 \)
- \( n = 0 \)(结束循环)
最后,返回的 `ans` 是 `5`,即 \( 3^{5} \mod 7 = 5 \)。
### 总结
这段代码有效地实现了快速幂算法,具有 \( O(\log n) \) 的时间复杂度,非常适合处理大数的幂运算和模运
D:小红的差值构造 - easy+hard+extreme


代码:(来源@以你为瘾)
#include<iostream>
using namespace std;
long long t,n,l,x,y,m;
void slove()
{
cin >> n >> l ;
if(n%2) m=n/2+1;
else m=n/2;
long long ans=0;
if(l<n)
{x=m-l/2,y=m+l-l/2;
ans=((1+x-1)*(x-1)+(1+m-x)*(m-x)+(1+y-m-1)*(y-m-1)+(1+n-y)*(n-y))/2;}
else {y=m;x=y-l;
ans=((1+y-1)*(y-1)+(1+n-y)*(n-y))/2;
}
cout << x << ' ' << y << ' ' << ans << endl ;
}
int main()
{
cin >> t ;
while(t--)
slove();
}

总结:
本次的竞赛参加得还算及时,拿出了比较好的状态,把自己平时学的东西,展示了出来。但是,真正能成为“牛”的人还是远远不够的,还只是“客”,而不是“牛”,任重而道远,加油吧!一步一步地努力!相信那些看似平常的日复一日,终有一天会让我们看到坚持的意义。
7787



被折叠的 条评论
为什么被折叠?



