定理證明(2050 Programming Competition - Warmup)

Problem Description
現在我們有n個定理,並且這n個定理是等價的,也就是說從任意一個定理出發,都可以推出其他所有的定理。

例如
定理1:有上界的實數集合必有上確界
定理2:有界實數列必有收斂子列
定理3:單調有界的實數列一定收斂

一共存在定理1→定理2、定理2→定理1、定理1→定理3、定理3→定理1、定理2→定理3、定理3→定理2這六種推導關係,但很顯然有些推導是冗餘的,例如,如果已經證明了定理1→定理2、定理2→定理3,那麼定理1→定理3是顯然成立的,證明定理1→定理3就是多餘的。

請問我們最多可以按順序寫出多少個推導關係,使得其中任意一個推導關係和前面的結合起來不是多餘的?

Input
第一行是一個整數T,表示有T組數據,接下來T組數據,每組數據包含一個整數n表示定理的個數。
1≤T≤100,1≤n≤1000

Output
對於每組數據,輸出答案除以 10^9+7 的餘數。

Sample Input
3
1
2
3

Sample Output
0
2
5

Hint

證明定理1→定理2、定理2→定理3,那麼定理1→定理3是冗餘的
證明定理1→定理2、定理1→定理3,那麼定理2→定理3不是冗餘的
**思路:**列出前幾個數據對應的值,可發現第一個數爲0,第二個數爲0 + 2 = 2, 第三個數爲2 + 3 = 5,第四個數爲5 + 4 = 9…發現每次都是上一個值加上2,3,4… 用數組存放結果,再輸出相應值即爲答案

#include <iostream>
using namespace std;
typedef long long ll;
ll mod = 1000000007;
int main() {
	ll a[1005] = {0}, num = 2;
	for(int i = 1; i < 1000; i++) {
		a[i] = (a[i-1] + num) % mod;
		num++;
	}
	int n, t;
	scanf("%d", &t);
	while(t--) {
		scanf("%d", &n);
		printf("%lld\n", a[n-1]);
	}
	return 0;
} 
發佈了63 篇原創文章 · 獲贊 10 · 訪問量 9760
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章