題目描述
農夫 john 正在籌畫從他的穀倉中售出 n 頭奶牛,與此同時也有 n 個農夫想要購買奶牛。每個農夫都有剛好足夠購買一頭奶牛的錢並且將會把買來的這頭奶牛用來**。為了減少買來的牛擠不出奶的風險,農夫們每個人都將會購買兩頭不同的奶牛各自一半的產權,然後將獲得每頭牛產奶量的一半。
如果將兩種方案中每個農夫都購買了相同的奶牛看作是相同的銷售方案。那麼農夫 john 一共有多少種不同的銷售方案呢?
輸入第一行包含乙個整數t ≤ 100,為資料的組數。接下來t行每行包含乙個整數n ≤ 2000作為輸入資料。
輸出對於每組資料,輸出農夫 john 銷售奶牛的不同方案數。由於這個數有可能會很大,因此請將答案對10^7 + 7取模後輸出。
312樣例輸出3
0提示16
對於50%的資料,n≤20,
對於100%的資料,n≤2000.
膜拜大佬(不打表會超時,有大佬寫的dp,但是看不懂)
#includeusing namespace std;
typedef long long ll;
const int mod=1e7+7;
map,ll>mp;
ll f(ll a,ll b)
ll ans=0;
if(a>=2) ans=(ans+a*(a-1)/2%mod*f(a-2,b+2)%mod)%mod;
if(b>=2) ans=(ans+b*(b-1)/2%mod*f(a,b-2)%mod)%mod;
if(a>=1&&b>=1) ans=(ans+a*b%mod*f(a-1,b)%mod)%mod;
return mp[t]=ans;
}ll ans[2005]=;
void init()
freopen("con","w",stdout);
printf("ok\n");
}int main()
return 0;
}
簡單的檔案讀寫
freopen()
freopen這個函式,在acm中應用很廣,因為acm試題中可能有大量輸入資料,程式執行往往不是一次成功的,每次執行都重新輸入很浪費時間,因此freopen就可以解決測試資料的重複輸入問題。
函式宣告:
file * freopen(const char *filename, const char *mode,file *stream);引數說明:
filename:要開啟的檔名;使用方法:mode:檔案開啟的模式,和fopen中的模式(r/w)相同。
stream:檔案指標,通常使用標準流檔案(stdin/stdout/stderr)
freopen("data.in","r",stdin);freopen()函式重定向了標準流,使其指向指定檔案,因此不需要修改scanf和printf。freopen("data.out","w",stdout);
fclose(stdin);
fclose(stdout);
確實很方便吧,不過還有個問題要解決。通過freopen我們把標準流重定向到了指定檔案,那麼如果我們想讓一些資訊輸出到螢幕,該怎麼做呢?
fopen函式由fprintf和printf兩個函式,分別輸出到檔案和控制台。而freopen函式,需要修改函式的filename引數,讓標準流輸出到控制台。而這個控制台裝置檔案的名字與作業系統相關。
dos、win系統:
freopen("con","r",stdin);linux:freopen("con","w",stdout);
freopen("/dev/console","r",stdin);這樣就能實現一部分需要的資料輸出到檔案,同時另一部分資料輸出到控制台。這樣讓程式擁有一些簡單的互動能力。
遞迴的函式(打表)
time limit 1000ms memory limit 65536k 有疑問?點這裡 給定乙個函式 f a,b,c 如果 a 0 或 b 0 或 c 0 返回值為 1 如果 a 20 或 b 20 或 c 20 返回值為 f 20,20,20 前兩個條件注意,輸入的時候就可以解決掉 如果 a ...
poj1207 遞迴和打表
題意比較難懂 乙個數字x,如果是奇數則x x 3 1,否則x x 2.直到x 1,這個過程所經過的長度叫做 迴圈數 題目給你2個數字i和j,求i和j區間中最大的迴圈數。i可能大於j!我的思路就是遞迴加打表,不過打表不能全打,因為範圍可能會超大,比如 9999 3 1 29998有點大啊,為了防止超出...
打表的一些操作
例題 題目描述 李浩傑大晚上不睡覺,問了我乙個問題 n 是多少?我想了想,感覺和上週周賽的斐波那契有點像,於是就有了這個題目.輸入輸入乙個t,表示t組資料 1 t 100 接下來t行,每行輸入乙個整數n 0 n 1000000000 輸出輸出t行,每行輸出乙個正整數 n 的結果 由於這個數比較大,所...