刚开始想这道题的时候确实很蒙,只想到矩形对边做对应的弧长相等,然后想办法凑出相等的弧长。其实正解很简单,不要去想边,应该想对角线,因为根据初中园的知识,这个矩形的对角线是圆的直径,而直径所对的弧是周长的一半,所以只要每局两个指针 i,j,如果这两个的距离是周长一半的话,就cnt++,所以最终的cnt就是直径的个数,所以答案就是C(2, cnt)。
用前缀和预处理距离。
1 #include2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 using namespace std;12 #define enter printf("\n")13 #define space printf(" ")14 #define Mem(a) memset(a, 0, sizeof(a))15 typedef long long ll;16 typedef double db;17 const int INF = 0x3f3f3f3f;18 const int eps = 1e-8;19 const int maxn = 25;20 inline ll read()21 {22 ll ans = 0;23 char ch = getchar(), last = ' ';24 while(!isdigit(ch)) {last = ch; ch = getchar();}25 while(isdigit(ch)) {ans = ans * 10 + ch - '0'; ch = getchar();}26 if(last == '-') ans = -ans;27 return ans;28 }29 inline void write(ll x)30 {31 if(x < 0) x = -x, putchar('-');32 if(x >= 10) write(x / 10);33 putchar(x % 10 + '0');34 }35 36 int n, a[maxn], sum[maxn], cnt = 0;37 38 int main()39 {40 n = read();41 for(int i = 1; i <= n; ++i) a[i] = read(), sum[i] = sum[i - 1] + a[i];42 for(int i = 1; i <= n; ++i)43 for(int j = i; j <= n; ++j)44 if(sum[j] - sum[i] == (sum[n] >> 1)) cnt++;45 write(cnt * (cnt - 1) >> 1); enter;46 return 0;47 }