[破碎的状态] [-57] Topcoder Open 2B
今天的比赛比上一次而言,特点如下:
1,如果你AC了一题,你基本上会涨Rating
2,如果你challenge成功了4个人,或者300分的题拿了大概180分左右就能进前40了
===================================
上一次是这样
1,如果你AC了一题,你基本上会涨Rating
2,如果你challenge成功了5个人,或者400分的题拿了大概230分左右就能进前40了
然而问题是..这次我似乎拿了160分,Rank 47没晋级...
谈谈今天的题目吧
300
求有多少a,b,c满足1<=a<=A,1<=b<=B,1<=c<=C且a,b,c能构成个三角形(答案对[tex]10^9+7[/tex]取模)(a,b,c均为整数)
1<=A,B,C<=[tex]10^9[/tex]
大概这题的做法不是很难,但不算特别好想
实现不算难吧
我们这时候可以这么办
不妨设a<=b<=c
先算出a*b*c的值,然后容斥的减掉三种情况
1, a>=b+c
2, b>=a+c
3, c>=a+b
对于1情况,我们可以枚举a=1,2,3...n,可以发现方案数为:
0,1,1+3,1+3+6...
据说,它们的和就是[tex]\frac{(A-1)*A*(A+1)}{6}[/tex]
所以..情况1就解决了
然后接下来,我们看2和3的情况
因为这么算,a>A的时候就挂了
我们可以容斥啊!
再容斥一发不就行了么!
所以我们对于2号情况的方案,就是
[tex]\frac{(B-1)*B*(B+1)}{6}-\frac{(B-A-1)*(B-A)*(B-A+1)}{6}[tex]
同理,3号方案稍微复杂点,还要考虑一些别的东西..
不仅a>A的问题,还有b>B的问题,还有两者同时发生的问题
[tex]\frac{(C-1)*C*(C+1)}{6}-\frac{(C-A-1)*(C-A)*(C-A+1)}{6}-\frac{(C-B-1)*(C-B)*(C-B+1)}{6}+\frac{(C-A-B-1)*(C-A-B)*(C-A-B+1)}{6}[tex]
特别的,如果C<A+B,则我们定义最后一项是0
也就是..
[tex]\frac{(C-1)*C*(C+1)}{6}-\frac{(C-A-1)*(C-A)*(C-A+1)}{6}-\frac{(C-B-1)*(C-B)*(C-B+1)}{6}[tex]
真奇怪..自己是公式恐惧症竟然还推了一堆这些东西出来..
反正..代码如下就对了
#include<set> #include<map> #include<list> #include<queue> #include<stack> #include<string> #include<time.h> #include<math.h> #include<memory> #include<vector> #include<bitset> #include<fstream> #include<stdio.h> #include<utility> #include<string.h> #include<iostream> #include<stdlib.h> #include<algorithm> using namespace std; const int modo=1000000007; long long power(int x,int y) { if (y==0) return 1ll; long long t=power(x,y/2); t=t*t%modo; if (y&1) t=(long long)t*x%modo; return t; } struct TriangleTriples { int count(int a,int b,int c) { if (a>b) swap(a,b); if (a>c) swap(a,c); if (b>c) swap(b,c); long long ans=(long long)a*b%modo*c%modo; ans-=(long long)a*(a+1)%modo*(a-1)%modo*power(6,modo-2)%modo; ans-=(long long)b*(b+1)%modo*(b-1)%modo*power(6,modo-2)%modo; ans-=(long long)c*(c+1)%modo*(c-1)%modo*power(6,modo-2)%modo; ans+=(long long)(b-a-1)*(b-a)%modo*(b-a+1)%modo*power(6,modo-2)%modo; ans+=(long long)(c-a-1)*(c-a)%modo*(c-a+1)%modo*power(6,modo-2)%modo; ans+=(long long)(c-b-1)*(c-b)%modo*(c-b+1)%modo*power(6,modo-2)%modo; if (c>=a+b) ans-=(long long)(c-a-b-1)*(c-a-b)%modo*(c-a-b+1)%modo*power(6,modo-2)%modo; return (ans%modo+modo)%modo; } }; #ifdef absi2011 int main() { freopen("input.txt","r",stdin); freopen("output.txt","w",stdout); return 0; } #endif
下面谈谈500
500分题大概是:
给你16种钻石,每种钻石的质量你不知道(但互不相同)
你现在有若干个包,每个包里有若干个钻石,一定是这16种中间的
对于任意相对质量顺序:
求是否都能找到重量最大的那个包(注意,是能不能找到而不是让你去找)
例如样例"AB""AC"
对于A>B>C或者B>A>C或者B>C>A的相对顺序,我们都可以抓"AB"
对于别的顺序,我们可以抓"AC"
重要的事情说三遍,问的是能不能
所以..
我不会做了..瞎搞了个算法很果断的爆炸了..不管了