HDU——5047 Sawtooth

题意:本题大意为一个形为“M”的多边形去分平面,一个“M”可将平面分为两部分,先给N个“M”,求分平面区域的最大个数。

解题思路:本题的规律可根据折线划分平面的思想来进行推导,在这给出一个折线划分平面的博客,大家可以根据这篇博客进行推导得出公式:8*n^2-7*n+1。另外由于本题所给的数据范围比较大10^12,属于大数类型的,一般的long long型也无法承受,后来看了一篇博客对大数的处理方法是将大数进行分割,即将长度为10^12可分为两个长度10^6,然后再将每一部分与10^12相乘,结果最大不将超过10^19,此大数刚好是long long 承受的范围。

在这给出一个折线划分平面的博客,大家可以根据这篇博客进行推导:点击打开链接

详见代码:

#include <iostream>
#include <cstdio>
using namespace std;
typedef long long LL;
const LL mod = 1000000;


int main()
{
    int T;
    LL bignum,high,low,n;
    scanf("%d",&T);
    for(int i = 1; i <= T; i++)
    {
        scanf("%I64d",&n);
        bignum = (n*8) - 7;
        high = bignum/mod;//将大数进行分割为高位high和低位low,两部分最大长度不超过10^6
        low = bignum%mod;
        low = low*n+1;//低位low与n相乘,长度最大不将超过10^19,恰好未超过long long的范围
        high = high*n+low/mod;//最高位high与n相乘之后,再加上最低位low相乘后产生的进位
        low %=mod;//对低位low再次取模
        printf("Case #%d: ",i);
        if(high) printf("%I64d%06I64d\n",high,low);//如果高位high不为0,输出高位high和低位low,此处%06I64d的意思是指定输出数长度为6,若长度小于6,整数左边空位补0
        else printf("%I64d\n",low);//如果高位high为0,直接输出低位low
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值