bzoj許可權題,但這個**可免費評測
題目描述
小生和小森在玩兔子之謎遊戲。有三隻兔子排成一排。知道每只兔子的初始位置,以及三個兔窩的位置。
遊戲的規則是,重複以下步驟k次:選擇兩個不同的兔子a和b,分別位於a和b。a可以跳過b到達2*b-a的點:
跳躍是不允許其他小兔子已經在點2*b-a的位置上:
跳躍也不允許一次跳過乙個以上的兔子:
現在小生和小森想要知道,k次操作之後,能否讓所有兔子都分別跳到乙個兔窩裡面。注意,第i個兔子並不一定要在第i個巢。並且輸出跳法的種數,數值可能很大,要對結果取模1000000007。只要有乙個跳躍是不同的,兩種方式被認為是不同的。
輸入 有多組測試資料:
第一行,包含乙個整數num,表示測試資料的個數。(1<=num<=10)
每組測試資料,
第一行三個整數,第二行三個整數,分別表示兔子的初始位置和兔窩的位置。兩組數值都是嚴格遞增給出。範圍均為[-10^18,10^18]。
最後乙個整數k。[1,100]。
輸出 共num行,
跳躍的種數。
樣例輸入
8 0 5 8
0 8 11
1 0 5 8
0 8 11
3 0 5 8
0 8 11
2 5 8 58
13 22 64
58 0 1 2
1 2 3
100
5 8 58
20 26 61
58 67 281 2348
235 1394 3293
83 -1000000000000000000 999999999999999998 999999999999999999
-1000000000000000000 999999999999999999 1000000000000000000
5 樣例輸出
1 5
0 0
0 537851168
167142023
29 提示
此題只有三隻兔子
可發現規律:向裡跳只有一種可能,向外跳有兩種可能
由此想到了樹,(初始狀態)為樹上乙個節點,要走到(終止狀態)的方案總數
lca=(初始狀態)與(終止狀態)最近公共祖先
f[i][j][k]表示(初始狀態)距離(lca)為i,(終止狀態)距離(lca)為j,還剩k步的方案總數。
#include
#include
#include
using namespace std;
#define m 1000000007
#define ll long long
ll f[105][105][105];
ll d[5],e[5];
ll dp1[105][5],dp2[105][5];
ll _a,_b,_c;
void up(ll a, ll b, ll c)
ll dfs(ll i, ll j, ll k, ll a, ll b, ll c)
else
if (i==0&&j>0)
if (i==0&&j==0)
return f[i][j][k]%m;
}}int main()else
if (dp1[i-1][1]-dp1[i-1][0]>dp1[i-1][2]-dp1[i-1][1])else
break;
}int ans1=-1,ans2=-1;
for (int i=0;i<=z;++i)
if (ans1!=-1) break;
if (i==z) break;
if (dp2[i][1]-dp2[i][0]2]-dp2[i][1])else
if(dp2[i][1]-dp2[i][0]>dp2[i][2]-dp2[i][1])else
break;
}if (ans1==-1)
for (int i=0;i<=100;++i)
for (int j=0;j<=100;++j)
for (int k=0;k<=100;++k)
f[i][j][k]=-1;
for (int i=0;i<=100;++i)
for (int j=0;j<=100;++j) f[i][j][0]=0;
f[0][0][0]=1;
printf("%lld\n",dfs(ans1,ans2,z,e[0],e[1],e[2])%m);
} return
0;}
樹形DP 兔子跳躍之謎下
題目描述 小生和小森在玩兔子之謎遊戲。有三隻兔子排成一排。知道每只兔子的初始位置,以及三個兔窩的位置。遊戲的規則是,重複以下步驟k次 選擇兩個不同的兔子a和b,分別位於a和b。a可以跳過b到達2 b a的點 跳躍是不允許其他小兔子已經在點2 b a的位置上 跳躍也不允許一次跳過乙個以上的兔子 現在小...
兔子與兔子
很久很久以前,森林裡住著一群兔子。有一天,兔子們想要研究自己的 dna 序列。我們首先選取乙個好長好長的 dna 序列 小兔子是外星生物,dna 序列可能包含 26 個小寫英文本母 然後我們每次選擇兩個區間,詢問如果用兩個區間裡的 dna 序列分別生產出來兩隻兔子,這兩個兔子是否一模一樣。注意兩個兔...
未解之謎與已解之謎
使用連線符 輸出雙引號public class test 輸出單引號 直接寫當引號system.out.println class aritest num1和num2資料型別為int,所以經過除運算之後 的結果自動轉化為int 2 再 num2,所以輸出結果為10.同理double result3 ...