目录
牛客小白49
A.水题模拟
直接读字符转数字取模很快,或者模拟进位
%10取个位,100/100取百位,其他位需要去其他数字
B.简单双指针设计
设计好双指针,统计过的才能继续统计 ,暴力On3
C.二进制运算按位与、或、异或
0&a1=0
0|a1=a1
0^a1=a1
1|1=1
1^1=0
从题意入手&求交集,|求并集,a1或a1子集就是a1后面同理
D.前缀和,快速幂求逆元,n^2求和公式
目标是:求一个函数的前缀和。
S(n)-S(m).很显然是区间求和。所以转化题目为:求[m,n]之间函数的和。
由图像 +"S(n)-S(m)和最大" 得性质:
那么对于每个函数图像来说。我们的n和m就可以去a和b这两个点。他们之间的和必然是最大的
/
那么就是n方,n,1求和在%p下运算那么/6要用快速幂求逆元,而且保证结果为正
ll s(ll x)
{
ll ans1=-x*(x+1)%p*(2*x+1)%p*qmi(6,p-2)%p;
ll ans2=(a+b)%p*x%p*(x+1)%p*qmi(2,p-2)%p;
ll ans3=-a*b%p*x%p;
ll ans=(ans1+ans2+ans3)%p;
return ans;
}
ll t=(s(b)-s(a))%p;
printf("%lld\n",(t+p)%p);
E 一维dp o(n)
f[i]表示当前位置到公主的符合条件的最小战斗力
假设从后往前遍历因为每个f[i]到f[i+1]的关系是加了a[i]于是
long long mx=0x3f3f3f3f;
for(int i=pos-1;i>=1;i--){
dp[i]=max(a[i]+1,dp[i+1]-a[i]);
mx=min(mx,dp[i]);
}
for(int i=pos+1;i<=n;i++){
dp[i]=max(a[i]+1,dp[i-1]-a[i]);
mx=min(mx,dp[i]);
武汉工程大学第四届
A 大模拟,sscanf、%02d
技巧
char a c语言多组输入scanf(%s,a)自动跳空格
sscanf
(a,
"%d:%d:%d"
, &h, &m, &s);从数组a中转换需要计算的数据、
用ans/3600来计算是否需要输出小时,运用倍数求答案后需要四舍五入
输出%02d自动补全前导0
#include<bits/stdc++.h>
using namespace std;
int main()
{
char a[20]; char b[20];
while (~scanf("%s%s",a,b))
{
int h = 0, m = 0, s = 0;
if (strlen(a) > 5)
{
sscanf(a, "%d:%d:%d", &h, &m, &s);
}
else
sscanf(a, "%d:%d", &m, &s);
int ans = h * 3600 + m * 60 + s;
double nm;
sscanf(b, "%lfx", &nm);
ans = ans * 1.0 / nm + 0.5;
if (ans/3600)
printf("%d:%02d:%02d\n", ans / 3600, ans %3600 / 60, ans % 60);
else
printf("%d:%02d\n", ans / 60, ans % 60);
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
}
return 0;
}
B 找到核心公式后直接递归预处理答案
注意:保留多个小数位,比如2位则(*100+0.5)/100.0
如果位数过多则用数组存
printf一定精度内自带四舍五入
I 打表找规律
手动打表发现答案只能是i方
最好利用计算机打表...
G 小球划分,快速幂递归求逆元
n种m个可以重复选择方案c(n+m-1,m)划分小球
快速幂+求逆元
Cba=a!b!(a−b)!=a!∗b!−1∗(a−b)!−1Cab=a!b!(a−b)!=a!∗b!−1∗(a−b)!−1
b!−1与(a−b)!−1
ll ans1=1,ans2=1,sum=n+m-1;
for(int i=1;i<=m;i++)
ans1=ans1*sum%mod,sum--;
for(int i=1;i<=m;i++)
ans2=ans2*i%mod;
ll t=ans1*qmi(ans2,mod-2)%mod;
数据多就用数组预处理
数组2e5就比较极限了算法只能on
E 思维题
现在你的面前有一个字符串长度为 nnn,你看他很不爽所以你想将它一刀两断,你可以从中间切一刀使字符串变成两半,我们将前一半记作s1s_1s1,将剩下一半记作s2s_2s2,如果满足s1s_1s1,s2s_2s2中都没有前导0并且存在两个正整数ccc,ddd使得 d%c==0(即d是c的倍数) && d/c==s1 && c*d==s2 那么我们把这种分发成为一种合法拆分方式,如果一个字符串有2种或者2种以上的合法拆分方式那样我们就把这个字符串成为一个合法字符串。
现在给定一个正整数 nnn (1≤n≤3001\leq n \leq 3001≤n≤300)请问是否可以构造出一个合法字符串,如果可以请在第一行输出'YES'否则输出'NO'
主要是看懂题目意思,s1,s2划分很好理解,c,d是满足条件的任意合理正整数,那么从样例1、2中可以知道只要给出n>3就可以构造出答案
16400
1144