比赛感想:
77名并不是很理想,本可以更好,况且大佬们都没打这种比赛。
前面五个题目 A G H I J ,基本上是1A,只有 I 题数组全部开了long long 爆了一次内存
当时排名20+
后面开始做D,一看题目就知道结果是5的个数
但是,一个这么简单的题,让我写错了,让我写错了,让我写错了
而且我当时还怀疑数据有问题,犯了不应该的错误,以此为戒
主要错误出自于下面的kaven函数:计算n中含有多少个因数5, 比如25是2个因数5 ,30是1个因数5
下面的代码有明显错误,我却不进行测试,还吐槽数据有问题(真是有病!)
贴出我错误的sb代码:
int kaven(int n){
int sum=1;
for(int i=1;;i++){
sum*=5;
if(sum==n) return i;
else if(sum>n) return i-1;
}
}
D题打乱了我的节奏后,以至于后面做 F 题的时候没有安心推规律,导致F题也没过掉
以至于后面一个多小时没有过题。
下面是这次比赛较容易的七个题 A D F G H I J
A 无关(relationship)
经典容斥原理题目。
#include
using namespace std;
typedef long long ll;
const int maxn=25;
int k;
ll ans[maxn];
ll kaven(ll a){
if(a==0) return 0;
ll num=a;
for(int i=1;i<(1<
D 阶乘(factorial)
结果就是有多少个5
这就很简单了
#include
using namespace std;
typedef long long ll;
inline int kaven(int n,int mul){
int cnt=0;
while(n%mul==0) cnt++,n/=mul;
return cnt;
}
int main(){
int n;
scanf("%d",&n);
ll a;
a=0;
for(int i=5;i<=n;i+=5){
a+=(ll)(n-i+1)*kaven(i,5);
}
printf("%lld\n",a);
}
F 圆(circle)
下面图片摘自题解
上面题解结果计算有点问题
F=E-V+2=C(n,4)+n*(n-1)+2
因为圆外还有一个区域,要减掉,因为题目是求圆内的区域个数
所以答案是:C(n,4)+n*(n-1)+1
#include
using namespace std;
typedef long long ll;
int main(){
ll n;
while(scanf("%lld",&n)==1){
printf("%lld\n",1+n*(n-1)/2+n*(n-1)*(n-2)*(n-3)/24);
}
return 0;
}
G 异或(xor)
开始题目意思没看懂,我就去看样例,发现鱼为偶数条的时候不能吃
题目看不懂,就只能碰碰运气了,看样例猜结论了
这是一个斐波拉契数列
1 1 2 3 5 8 13 21 34
奇 奇 偶 奇 奇 偶 奇 奇 偶
天数是三的倍数时,鱼的数量为偶数,即不能吃
所以有n -n/3 天能吃
交上去就A了,果然样例出奇迹
#include
using namespace std;
int main(){
long long n;
while(scanf("%lld",&n)==1){
printf("%lld\n",n-n/3);
}
}
H 最大公约数(lcm)
水题
#include
using namespace std;
typedef unsigned long long ll;
inline ll gcd(ll a,ll b){
return b==0?a:gcd(b,a%b);
}
int main(){
ll n,m;
scanf("%llu%llu",&n,&m);
printf("%llu",n/gcd(n,m)*m);
}
I 区间 (interval)
经典树状数组区间修改和区间查询题,用线段树的话,内存应该会爆吧,我用树状数组把数组全部开long long内存就爆了,后面把 ans[] 改成 int 才过,线段树估计也悬
#include
using namespace std;
typedef long long ll;
const int maxn=1000000+100;
ll bit[maxn][2];
int ans[maxn];
int n,m;
inline int lowbit(int x){
return x&(-x);
}
inline void Add(int x,ll v,int ind){
while(x<=n){
bit[x][ind]+=v;
x+=lowbit(x);
}
}
inline ll getSum(int x,int ind){
ll sum=0;
while(x>0){
sum+=bit[x][ind];
x-=lowbit(x);
}
return sum;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%lld",&ans[i]);
}
for(int i=1;i<=m;i++){
int q,l,r,p;
scanf("%d%d%d%d",&q,&l,&r,&p);
if(q==1){
p*=-1;
Add(l,p,0);
Add(r+1,-p,0);
Add(l,(ll)l*p,1);
Add(r+1,(ll)(-r-1)*p,1);
}
else{
Add(l,p,0);
Add(r+1,-p,0);
Add(l,(ll)l*p,1);
Add(r+1,(ll)(-r-1)*p,1);
}
}
int l,r;
scanf("%d%d",&l,&r);
ll tmp=(r+1)*getSum(r,0)-getSum(r,1);
tmp-=l*getSum(l-1,0)-getSum(l-1,1);
for(int i=l;i<=r;i++) tmp+=(ll)ans[i];
printf("%lld\n",tmp);
}
J 时间(time)
简单题
#include
using namespace std;
int main(){
int a,b;
scanf("%d:%d",&a,&b);
if(a==0){
int c,d;
c=0,d=0;
if(db) printf("%d:%d\n",c,d);
else{
printf("0:0\n");
}
}
else{
int c,d;
c=a;
d=c%10*10+c/10;
if(d=60) c--,d=c%10*10+c/10;
printf("%d:%d\n",c,d);
}
c=a;
d=c%10*10+c/10;
if(d>b&&d<60) printf("%d:%d\n",c,d);
else{
c++;
d=c%10*10+c/10;
while(d>=60) c++,d=c%10*10+c/10;
printf("%d:%d\n",c,d);
}
}
}