uva 10519!! Really Strange !!

来源:互联网 发布:淘宝api转换淘口令 编辑:程序博客网 时间:2024/06/05 06:06

原题:
Raju has recently passed BSc. Engineering in Computer Science & Engineering from BUET (Bangladesh University of Extraordinary Talents), the best university of Bangladesh. After passing, he has been appointed manager of BCS (Bangladesh Calculation Society ). His first project is to visit a district and then to report the total number of distinct regions there. But, going there, he is astonished to see a very strange phenomena of the local people. He discovered that, the people make their area circular.
Every two area have exactly two points to intersect and no three circles intersect in a common point. There are so many people so that it’s very hard to calculate total number of distinct regions for Raju. So, only in this case he seeks for your help.
Input
The problem contains multiple test cases. You are given total number of circular area n in separate
lines (n ≤ 10 100 ). And you know the number houses in the world can’t be fraction or negative. Input
is terminated by end of file.
Output
For each line of the input, your correct program should output the value of the total number of regions
in separate lines for each value of n.
Sample Input
3
4
Sample Output
8
14
中文:
给你n个圆环,问你最多能把平面分成多少块区域。

#include <bits/stdc++.h>using namespace std;const int maxn=1000;/*精度位数*//*(必选)类与基础功能定义,用法类似于unsigned(非负)*/class bign{        friend istream& operator>>(istream&,bign&);/*输入运算符友元*/        friend ostream& operator<<(ostream&,const bign&);/*输出运算符友元*/        friend bign operator+(const bign&,const bign&);/*加号运算符友元*/        friend bign operator*(const bign&,const bign&);/*乘号运算符友元*/            friend bign operator*(const bign&,int);/*高精度乘以低精度乘法友元*/        friend bign operator-(const bign&,const bign&);/*减号运算符友元*/        friend bign operator/(const bign&,const bign&);/*除法运算符友元*/        friend bign operator%(const bign&,const bign&);/*模运算符友元*/            friend bool operator<(const bign&,const bign&);/*逻辑小于符友元*/        friend bool operator>(const bign&,const bign&);/*逻辑大于符友元*/        friend bool operator<=(const bign&,const bign&);/*逻辑小于等于符友元*/            friend bool operator>=(const bign&,const bign&);/*逻辑大于等于符友元*/                friend bool operator==(const bign&,const bign&);/*逻辑等符友元*/        friend bool operator!=(const bign&,const bign&);/*逻辑不等符友元*/    private:        int len,s[maxn];    public:        bign(){memset(s,0,sizeof(s));len=1;}        bign operator=(const char* num)    {                int i=0,ol;                ol=len=strlen(num);                while(num[i++]=='0'&&len>1)                len--;                memset(s,0,sizeof(s));                for(i=0;i<len;i++)                s[i]=num[ol-i-1]-'0';                return *this;    }        bign operator=(int num)    {                char s[maxn];                sprintf(s,"%d",num);                *this=s;                return *this;    }        bign(int num){*this=num;}        bign(const char* num){*this=num;}        string str() const    {                int i;                string res="";                for(i=0;i<len;i++)res=char(s[i]+'0')+res;                if(res=="")res="0";                return res;    }};/*(可选)基本逻辑运算符重载*/bool operator<(const bign& a,const bign& b){        int i;        if(a.len!=b.len)return a.len<b.len;        for(i=a.len-1;i>=0;i--)            if(a.s[i]!=b.s[i])        return a.s[i]<b.s[i];        return false;}bool operator>(const bign& a,const bign& b){return b<a;}bool operator<=(const bign& a,const bign& b){return !(a>b);}bool operator>=(const bign& a,const bign& b){return !(a<b);}bool operator!=(const bign& a,const bign& b){return a<b||a>b;}bool operator==(const bign& a,const bign& b){return !(a<b||a>b);}/*(可选)加法运算符重载*/bign operator+(const bign& a,const bign& b){        int i,max=(a.len>b.len?a.len:b.len),t,c;        bign sum;        sum.len=0;        for(i=0,c=0;c||i<max;i++)    {                t=c;                if(i<a.len)t+=a.s[i];                if(i<b.len)t+=b.s[i];                sum.s[sum.len++]=t%10;                c=t/10;    }        return sum;}/*(可选)乘法运算符重载(高精度乘高精度)*/bign operator*(const bign& a,const bign& b){        int i,j;        bign res;        for(i=0;i<a.len;i++)    {                for(j=0;j<b.len;j++)        {                        res.s[i+j]+=(a.s[i]*b.s[j]);                        res.s[i+j+1]+=res.s[i+j]/10;                        res.s[i+j]%=10;        }    }        res.len=a.len+b.len;        while(res.s[res.len-1]==0&&res.len>1)res.len--;        if(res.s[res.len])res.len++;        return res;}/*高精度乘以低精度(注意:必须是bign*int顺序不能颠倒,要么会与高精度乘高精度发生冲突*/bign operator*(const bign& a,int b){        int i,t,c=0;        bign res;        for(i=0;i<a.len;i++)    {                t=a.s[i]*b+c;                res.s[i]=t%10;                c=t/10;    }        res.len=a.len;        while(c!=0)    {                res.s[i++]=c%10;                c/=10;                res.len++;    }        return res;}/*(可选)减法运算符重载*/bign operator-(const bign& a,const bign& b){        bign res;        int i,len=(a.len>b.len)?a.len:b.len;        for(i=0;i<len;i++)    {                res.s[i]+=a.s[i]-b.s[i];                if(res.s[i]<0)        {                        res.s[i]+=10;                        res.s[i+1]--;        }    }        while(res.s[len-1]==0&&len>1)len--;        res.len=len;        return res;}/*(可选)除法运算符重载(注意:减法和乘法运算和>=运算符必选)*/bign operator/(const bign& a,const bign& b){        int i,len=a.len;        bign res,f;        for(i=len-1;i>=0;i--)    {                f=f*10;                f.s[0]=a.s[i];                while(f>=b)        {                        f=f-b;                        res.s[i]++;        }    }        while(res.s[len-1]==0&&len>1)len--;        res.len=len;        return res;}/*(可选)模运算符重载(注意:减法和乘法运算和>=运算符必选)*/bign operator%(const bign& a,const bign& b){        int i,len=a.len;        bign res,f;        for(i=len-1;i>=0;i--)    {                f=f*10;                f.s[0]=a.s[i];                while(f>=b)        {                        f=f-b;                        res.s[i]++;        }    }        return f;}/*(可选)X等运算符重载(注意:X法必选)*/bign& operator+=(bign& a,const bign& b){        a=a+b;        return a;}bign& operator-=(bign& a,const bign& b){        a=a-b;        return a;}bign& operator*=(bign& a,const bign& b){        a=a*b;        return a;}bign& operator/=(bign& a,const bign& b){        a=a/b;        return a;}/*可选前缀++/--与后缀++/--(注意:加法必选)*/bign& operator++(bign& a){        a=a+1;        return a;}bign& operator++(bign& a,int){        bign t=a;        a=a+1;        return t;}bign& operator--(bign& a){        a=a-1;        return a;}bign& operator--(bign& a,int){        bign t=a;        a=a-1;        return t;}istream& operator>>(istream &in,bign& x){        string s;        in>>s;        x=s.c_str();        return in;}ostream& operator<<(ostream &out,const bign& x){        out<<x.str();        return out;}bign n;int main(){    ios::sync_with_stdio(false);    while(cin>>n)    {        if(n==0)        cout<<1<<endl;        else        cout<<n*n-n+2<<endl;    }    return 0;}

思路:

简单的递推题目,f[n]=f[n-1]+2*(n-1)。每多一个交点,就多一块区域。

0 0
原创粉丝点击