
2 1 2
Case #1: 2 Case #2: 19
题解及代码:
推导公式很简单:首先通过看图,我们可以知道,任意两个M都能相交出现16个交点,然后对M进行标号1--n,总的交点数就是∑16*i (1=<i<n),
然后根据:边数+点数+1=分成的区域数,可以算出公式是:8*n^2-7*n+1。因为数比较大,所以会想到用java,结果kuangbin大神卡的很紧Orz....
那就用c++的大数模版来吧,通过观察我们发现:上述公式可以转换一下成n*(8*n-7)+1,这里8*n可以用位运算来算,我们让m=8*n-7,m最大也到
不了10^13,而n最大是10^12,这样我们可以利用大数的思想,将m分成两部分,分别与n进行相乘,最后简单处理一下输出就行了。
Time:187ms
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
const ll mod=1000000;
int main()
{
ll n,m,l_m,r_m;
int cas;
scanf("%d",&cas);
for(int ca=1; ca<=cas; ca++)
{
scanf("%I64d",&n);
//printf("%I64d\n",8*n*n-7*n+1);
m=(n<<3)-7;
l_m=m/mod;
r_m=m%mod;
l_m*=n;
r_m=r_m*n+1;
l_m=l_m+r_m/mod;
r_m%=mod;
printf("Case #%d: ",ca);
if(l_m) printf("%I64d%06I64d\n",l_m,r_m);
else printf("%I64d\n",r_m);
}
return 0;
}
原文:http://blog.csdn.net/knight_kaka/article/details/39614167