HDU——5047 Sawtooth

来源:互联网 发布:linux vi命令大全 编辑:程序博客网 时间:2024/05/07 12:14

题意:本题大意为一个形为“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;}


0 0
原创粉丝点击