折线分割平面
对于一条折线我们可以清楚的发现有两个面,如果我们现在在加一条直线,那么可以很清晰的看到了我们多增加3个平面,那么如果我们再增加折线的另一部分发现又增加了两个面,所以我们可以得到了5个面,当且仅当i=2的时候,瞎推理了下,发现每增加一条边上是当前是第i个折线的2倍-1,继续增加下一条发现是2倍-2所以我们得到递推式,
a[i] = a[i-1] + 2 * i -1 +2*i-2。
附上ac代码
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn =100000+ 10;
int a[maxn];
int t;
void solve()
{
a[1] =2;
for(int i = 2;i<=10010;i++)
{
a[i] = a[i-1] + 2*i-1 + 2*i-2;
}
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
printf("%d\n",a[n]);
}
}
int main()
{
solve();
return 0;
}
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
import java.util.Stack;
import java.lang.Math;
public class Main
{
Scanner cin = new Scanner(new BufferedInputStream(System.in));
int t;
int[] a = new int[10010 + 10];
int n;
void solve()
{
t = cin.nextInt();
a[1] = 2;
for(int i=2;i<=10010;i++)
{
a[i] = a[i-1] + 2 * i -1 + 2 * i - 2;
}
while(t!=0)
{
t--;
n = cin.nextInt();
System.out.println(a[n]);
}
}
public static void main(String[] args)
{
new Main().solve();
}
}