UVa 10519 !! Really Strange !! (递推)

10519 - !! Really Strange !!

Time limit: 3.000 seconds

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=115&page=show_problem&problem=1460

思路:注意到题目所说“Every two area have exactly two points to intersect and no three circles intersect in a common point”,所以第n个圆与其它n-1个圆共有2*(n-1)个交点,新生成2*(n-1)个区域,所以f(n)=f(n-1)+2*(n-1),进而可得f(n)=n^2-n+2,边界f(0)=1。

完整代码:

/*0.012s*/

#include<bits/stdc++.h>
using namespace std;
const int maxn = 210;

char numstr[maxn];

struct bign
{
    int len, s[maxn];

    bign()
    {
        memset(s, 0, sizeof(s));
        len = 1;
    }

    bign(int num)
    {
        *this = num;
    }

    bign(const char* num)
    {
        *this = num;
    }

    bign operator = (const int num)
    {
        char s[maxn];
        sprintf(s, "%d", num);
        *this = s;
        return *this;
    }

    bign operator = (const char* num)
    {
        len = strlen(num);
        for (int i = 0; i < len; i++) s[i] = num[len - i - 1] & 15;
        return *this;
    }

    ///输出
    const char* str() const
    {
        if (len)
        {
            for (int i = 0; i < len; i++)
                numstr[i] = '0' + s[len - i - 1];
            numstr[len] = '\0';
        }
        else strcpy(numstr, "0");
        return numstr;
    }

    ///去前导零
    void clean()
    {
        while (len > 1 && !s[len - 1]) len--;
    }

    ///加
    bign operator + (const bign& b) const
    {
        bign c;
        c.len = 0;
        for (int i = 0, g = 0; g || i < max(len, b.len); i++)
        {
            int x = g;
            if (i < len) x += s[i];
            if (i < b.len) x += b.s[i];
            c.s[c.len++] = x % 10;
            g = x / 10;
        }
        return c;
    }

    ///减
    bign operator - (const bign& b) const
    {
        bign c;
        c.len = 0;
        for (int i = 0, g = 0; i < len; i++)
        {
            int x = s[i] - g;
            if (i < b.len) x -= b.s[i];
            if (x >= 0) g = 0;
            else
            {
                g = 1;
                x += 10;
            }
            c.s[c.len++] = x;
        }
        c.clean();
        return c;
    }

    ///乘
    bign operator * (const bign& b) const
    {
        bign c;
        c.len = len + b.len;
        for (int i = 0; i < len; i++)
            for (int j = 0; j < b.len; j++)
                c.s[i + j] += s[i] * b.s[j];
        for (int i = 0; i < c.len - 1; i++)
        {
            c.s[i + 1] += c.s[i] / 10;
            c.s[i] %= 10;
        }
        c.clean();
        return c;
    }

    ///除
    bign operator / (const bign &b) const
    {
        bign ret, cur = 0;
        ret.len = len;
        for (int i = len - 1; i >= 0; i--)
        {
            cur = cur * 10;
            cur.s[0] = s[i];
            while (cur >= b)
            {
                cur -= b;
                ret.s[i]++;
            }
        }
        ret.clean();
        return ret;
    }

    ///模、余
    bign operator % (const bign &b) const
    {
        bign c = *this / b;
        return *this - c * b;
    }

    bool operator < (const bign& b) const
    {
        if (len != b.len) return len < b.len;
        for (int i = len - 1; i >= 0; i--)
            if (s[i] != b.s[i]) return s[i] < b.s[i];
        return false;
    }

    bool operator > (const bign& b) const
    {
        return b < *this;
    }

    bool operator <= (const bign& b) const
    {
        return !(b < *this);
    }

    bool operator >= (const bign &b) const
    {
        return !(*this < b);
    }

    bool operator == (const bign& b) const
    {
        return !(b < *this) && !(*this < b);
    }

    bool operator != (const bign &a) const
    {
        return *this > a || *this < a;
    }

    bign operator += (const bign &a)
    {
        *this = *this + a;
        return *this;
    }

    bign operator -= (const bign &a)
    {
        *this = *this - a;
        return *this;
    }

    bign operator *= (const bign &a)
    {
        *this = *this * a;
        return *this;
    }

    bign operator /= (const bign &a)
    {
        *this = *this / a;
        return *this;
    }

    bign operator %= (const bign &a)
    {
        *this = *this % a;
        return *this;
    }
};

int main()
{
    bign n;
    while (gets(numstr))
    {
        n = numstr;
        puts(n == 0 ? "1" : (n * n - n + 2).str());
    }
    return 0;
}

作者:csdn博客 synapse7

查看本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/sjjg/

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索int
, return
, this
, const
, operator
len
win10 10519、递推公式、递推宝、递推公式求通项公式、递推数列,以便于您获取更多的相关知识。

时间: 2025-01-02 10:14:16

UVa 10519 !! Really Strange !! (递推)的相关文章

UVa 10049 Self-describing Sequence:自描述序列&amp;amp;二分递推

10049 - Self-describing Sequence Time limit: 3.000 seconds http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=34&page=show_problem&problem=990 Solomon Golomb's self­describing sequence is the only non­decreasing

“大整数阶乘”问题的递推算法

/* 标题:<<系统设计师>>应试编程实例-[递推算法程序设计] 作者:成晓旭 时间:2002年09月11日(11:52:00-16:26:00) 实现递推算法的大整数阶乘处理函数 时间:2002年09月16日(18:38:00-20:02:00) 实现"斐波那契数列"问题的递推算法函数 */ //:============================"大整数阶乘"问题的递推算法=========================== #d

c++问题-递推 数的划分问题一

问题描述 递推 数的划分问题一 把正整数N分解成M个正整数的和,即使M个数相同但顺序不同也认为是不同的方案,要求总方案数.如3=1+2跟3=2+1是两个不同的方案

递推求解专题练习

hdoj2044--一只小蜜蜂... Problem Description 有一只经过训练的蜜蜂只能爬向右侧相邻的蜂房,不能反向爬行.请编程计算蜜蜂从蜂房a爬到蜂房b的可能路线数. 其中,蜂房的结构如下所示.   Input 输入数据的第一行是一个整数N,表示测试实例的个数,然后是N 行数据,每行包含两个整数a和b(0<a<b<50). Output 对于每个测试实例,请输出蜜蜂从蜂房a爬到蜂房b的可能路线数,每个实例的输出占一行. Sample Input 2 1 2 3 6 Sam

算法--递推策略

递推法是一种重要的数学方法,在数学的各个领域中都有广泛的运用,也是计算机用于数值计算的一个重要算法.这种算法特点是:一个问题的求解需一系列 的计算,在已知条件和所求问题之间总存在着某种相互联系的关系,在计算时,如果可以找到前后过程之间的数量关系(即递推式),那么,从问题出发逐步推到已 知条件,此种方法叫逆推.无论顺推还是逆推,其关键是要找到递推式.这种处理问题的方法能使复杂运算化为若干步重复的简单运算,充分发挥出计算机擅长于重 复处理的特点. 递推算法的首要问题是得到相邻的数据项间的关系(即递推

POJ2229 递推

这题明显递推 但是找了好久才找出来 很明显的是n为奇数的时候 n=n-1的偶数答案一样 n为偶数的时候 答案为 上一个偶数是情况 +1 +1 还有n/2 的情况同一 *2 所以h[n]=h[n-2]+h[n/2] #include <iostream> #include<cstdio> #include<cstring> using namespace std; int d[1000005]; int main() { d[1]=1; d[2]=2; for(int i

互联网设计瀑布递推

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 递推流程有明显的阶段划分僵化劣势,优点缺点显而易见: 适合技术较弱或缺乏经验的设计团队. 适合容易理解但很复杂的产品,易于组织和管理. 适合稳定的产品定义和很容易被理解的设计解决方案. 适合对产品规模的升级和架构扩展,质量容易保证. 与软件工程思想并无二致,基于以上特点,递推流程尤其不适合互联网产品的创新设计.虽然经过江湖前辈的努力总结提炼,

算法——递推算法

递推算法 给定一个数的序列H0,H1,-,Hn,-若存在整数n0,使当n>n0时,可以用等号(或大于号.小于号)将Hn与其前面的某些项Hi(0<i<n)联系起来,这样的式子就叫做递推关系. 递推算法是一种简单的算法,即通过已知条件,利用特定关系得出中间推论,直至得到结果的算法.  递推算法分为顺推和逆推两种. 相对于递归算法,递推算法免除了数据进出栈的过程,也就是说,不需要函数不断的向边界值靠拢,而直接从边界出发,直到求出函数值.  比如阶乘函数:f(n)=n*f(n-1)  在f(3)

算法题:UVA 10519

THE SAMS' CONTEST   Problem 0 !! REALLY STRANGE !! BACKGROUND Raju has recently passed BSc. Engineering in Computer Science & Engineering from BUET ( Bangladesh University of Extraordinary Talents), the best university of Bangladesh. After passing, h