http://acm.hdu.edu.cn/contests/contest_showproblem.php?pid=1003&cid=832

Problem Description

In the world line 1.048596%

在反覆上演的梦境中,两年前的梓川咲太坐在通往沙滩的阶梯,心不在焉地看着七里滨的海。

这也一定是梦,接下来的进展他早已知晓。翔子小姐就要来了。

“咲太小弟今天的心情也处于低潮呢。”,翔子踩着轻快脚步现身,坐在咲太身旁。

“翔子小姐今天也有点烦人呢。”

“即使每天来到海边也没有治愈荒废的心吗?我来告诉你摆脱无聊的方法。我从一个朋友那边听来的。”出乎意料的,翔子小姐站了起来。

“难道是数质数吗?别开玩...”,梓川咲太的话没说完,就被翔子小姐拉到海边,然后一起捡贝壳。

捧满贝壳的梓川咲太,又被拉着用脚在沙滩上踩出圆环的形状。

然后翔子小姐又把贝壳随意的放在圆环上。

做完这一切后,翔子小姐又拉着咲太小弟站到了防波堤上面。

“那么咲太小弟,你知道这些贝壳里面能形成多少个不重复的矩形吗?”

“两个矩形不相同当且仅当选取的四个贝壳的位置不同哦。”

咲太小弟不过是普通的初中生,也许这个问题只有翔子小姐才知道如何解答。

“不要觉得自己不会哦,这无关能力的事情。”翔子小姐温柔的说。

“我的朋友这样说过,许多失败了的未来,无法挽回的过去,但是肯定在这之后,会有连接到......”

......

咲太任凭情感漩涡驱使而想要转身,但是做不到。

梦醒了。

 

 

Input

多组输入输出

对于每组样例,第一行一个正整数n(n<=300),代表圆环上有多少个贝壳。

接下来n行分别为这n个贝壳所分割的各个圆弧的长度s(1<=s<=15)。

输入保证:

1:每组样例给出的圆弧的长度按顺时针的顺序给出。

2:所有样例输入的n的和不超过500

 

 

Output

对于每组样例,输出一个整数,代表能形成不同矩形的个数

 

 

Sample Input


 

8 1 2 2 3 1 1 3 3

 

 

Sample Output


 

3

Hint

样例的图如下


 

C++版本一

数一下直径就行了

/*
*@Author:   STZG
*@Language: C++
*/
#include <bits/stdc++.h>
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<string>
#include<vector>
#include<bitset>
#include<queue>
#include<deque>
#include<stack>
#include<cmath>
#include<list>
#include<map>
#include<set>
//#define DEBUG

using namespace std;
typedef long long ll;
const int N=10000;
const double PI = acos(-1.0);
const double EXP = 1E-8;
const int INF = 0x3f3f3f3f;
int t,n,m;
int a[N],b[N];
bool BS(int x){
    int l=0;
    int r=n;
    int mid;
    while(l<=r){
        mid=(l+r)>>1;
        if(b[mid]==x)   return 1;
        else if(b[mid]<x)   l=mid+1;
        else r=mid-1;
    }
    return 0;
}
int main()
{
#ifdef DEBUG
	freopen("input.in", "r", stdin);
	//freopen("output.out", "w", stdout);
#endif
    while(~scanf("%d",&n)){
        int sum=0;
        a[0]=0;
        b[0]=0;
        for(int i=1;i<=n;i++){
            scanf("%d",&a[i]);
            sum+=a[i];
            b[i]=sum;
        }
        int ans=0;
        if(sum%2){
            cout << ans << endl;
            continue;
        }
        int cnt=0;
        for(int i=1;i<=n;i++){
                if(BS((b[i]+sum/2)%sum))
                    cnt++;
        }
        ans=cnt*(cnt-1)/2-cnt/2;
        cout << ans/4 << endl;
    }
  //  cout << "Hello world!" << endl;
    return 0;
}

 

C++版本二

https://www.cnblogs.com/MingSD/p/10050324.html

如果是矩形的话,那么一定是在直径上,然后找到一个直径,然后就枚举可能存在的矩形,如果存在矩形,则弧长相等。

#include<bits/stdc++.h>
using namespace std;
#define Fopen freopen("_in.txt","r",stdin); freopen("_out.txt","w",stdout);
#define LL long long
#define ULL unsigned LL
#define fi first
#define se second
#define pb push_back
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define lch(x) tr[x].son[0]
#define rch(x) tr[x].son[1]
#define max3(a,b,c) max(a,max(b,c))
#define min3(a,b,c) min(a,min(b,c))
typedef pair<int,int> pll;
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const LL mod =  (int)1e9+7;
const int N = 305;
int a[N];
int n;
int L = 0;
inline int cal(int x, int y){
    if(x > n) x -= n;
    if(y > n) y -= n;
    if(x > y) swap(x, y);
    return min(a[y]-a[x], a[x]+L-a[y]);
}
int main(){
    while(~scanf("%d", &n)){
        for(int i = 2; i <= n; ++i){
            scanf("%d", &a[i]);
            a[i] += a[i-1];
        }
        scanf("%d", &L);
        L += a[n];
        int ans = 0;
        if(L&1) {
            printf("0\n");
            continue;
        }
        for(int i = 1; i <= n; ++i){
            for(int j = i+1; j <= n; ++j){
                if(cal(i,j) != L/2) continue;
                for(int k = i+1; k < j; ++k){
                    for(int z = j+1; z < i+n; ++z){
                        int t1 = cal(i,k), t2 = cal(j,z);
                        if(t1 == t2) ans++;
                        else if(t1 < t2) break;
                    }
                }
            }
        }
        cout << ans/2 << endl;
    }
    return 0;
}