1. 程式人生 > 其它 >[USACO08OCT]Building A Fence G

[USACO08OCT]Building A Fence G

來自 luogu P6184 Building A Fence G

方法是找規律

在經過三重迴圈暴力列舉後,
發現了在每個資料之間極其微妙的關係:

當 n=4 和 n=5 時,兩者相差為 3。
當 n=5 和 n=6 時,兩者相差為 2。
當 n=6 和 n=7 時,兩者相差為 10。
當 n=7 和 n=8 時,兩者相差為 3。
當 n=8 和 n=9 時,兩者相差為 21。
當 n=9 和 n=10 時,兩者相差為4。
………………

當然如果這樣還是看不出來,

那我們就換一種方法看看

    	//假設3前面有1,那麼
    3	//1*(1*2+1)=3
2  10	//2*(2*2+1)=10
3  21	//3*(3*2+1)=21
4  36	//4*(4*2+1)=36
…………

通過這種方法可以求出差值,
那麼用前一個數加上這兩個數的差值就珂以得出這個數啦

上程式碼

//by_Hitclyr__Wncr
#include<bits/stdc++.h>
using namespace std;
long long n,m[100010];// n  存放差值 
long long sm[100010];// 存放每個的方案數 
long long cnt=2;	//計數器 
long long tot=1; 	//計數器 
int main()
{
	scanf("%lld",&n);
	for(long long i=4;i<=n;i++,tot++)
	{
		m[++cnt]=tot; 
		m[++cnt]=tot*(tot*2+1);//計算差值
	}
	sm[4]=1;//當n=4時方案數為 1 
	for(long long i=5;i<=n;i++)
	{
		sm[i]=sm[i-1]+m[i-1];//計算方案數
	}
	printf("%lld",sm[n]);
	return 0;
}