XJOI 夏令營501 511測試11 統計方案

2022-05-25 16:12:09 字數 1647 閱讀 9803

小b寫了乙個程式,隨機生成了n個正整數,分別是a[1]..a[n],他取出了其中一些數,並把它們乘起來之後模p,得到了餘數c。但是沒過多久,小b就忘記他選了哪些數,他想把所有可能的取數方案都找出來。你能幫他計算一下一共有多少種取數方案嗎?請把最後的方案數模1000000007後輸出。

小b記得他至少取了乙個數。

第一行三個正整數n,p,c,含義如題目所述。

接下來一行有n個正整數,表示生成的n個隨機數。

乙個數,方案數模1000000007。

2 7 2

1 2 4

2

對於30%的資料,n≤16

另有30%的資料,p≤10000

對於100%的資料,n≤32, p≤10^9, c≤10^9, a[i]1 sec

128mb

題目鏈結

因為n只有32的範圍

所以考慮折半搜尋,將前$\frac$和後$\frac$個元素的所有乘積處理出來

然後將這兩組之間的元素進行匹配

對於一組中的乘積$a$,那麼需要在另一組中找到$b$,滿足$a*b \equiv c$

那麼可以發現$b$為$a$的逆元$k$再乘上$c$,因為$p$是質數,那麼$k$可以用費馬小定理解決

即$b=a^*c$,在$b$的陣列中二分查詢即可

還有這道題有個坑點

1.如果$c\geq p$答案即為0

#include #define mod 1000000007

#define ll long long

using

namespace

std;

ll n,p,c,a[

1000

],tot,ans;

vector

s;vector

>t;

ll m_pow(ll a,ll b)//快速冪,求逆元

return

ans;

}void

dfs1(ll x,ll l,ll r,ll sum)//用dfs求出每乙個乘積

dfs1(x+1

,l,r,sum);

dfs1(x+1,l,r,(sum*a[x])%p);

}void

dfs2(ll x,ll l,ll r,ll sum)

dfs2(x+1

,l,r,sum);

dfs2(x+1,l,r,(sum*a[x])%p);

}int

main()

for (ll i=1;i<=n;i++)

a[i]%=p;

dfs1(

1,1,n/2,1

); sort(s.begin(),s.end());

ll kind=s[0],w=1

;

for (ll i=1;i<(ll)s.size();i++)

}t.push_back(make_pair(kind,w));

tot=0

; dfs2(n/2+1,n/2+1,n,1

);

if (c==1

) ans=(ans-1)%mod;

printf(

"%lld\n

",ans%mod);

}

夏令營 8 20 測試

奇怪的考試題 題目名稱 數值距離 最短路放棋子 可執行檔名 disroad chess 輸入檔名 dis.in road.in chess.in 輸出檔名 dis.out road.out chess.out 記憶體限制 256mb 256mb 256mb 每個測試點時限 2s 1s 1s 測試點數...

開源夏令營(1)

前段時間主要做了git的一些配置和熟悉 git pull 從其他的版本庫 既可以是遠端的也可以是本地的 將 更新到本地。git add 是將當前更改或者新增的檔案加入到git的索引中,加入到git的索引中就表示記入了版本歷史中,這也是提交之前所需要執行的一步 git rm 從當前的工作空間中和索引中...

開源夏令營總結

時間過得很快,開源夏令營就要結束了,今天就簡單總結一下這段時間的所學所做。1.研究源 因為專案已經有一定規模,所以第一步肯定是要先弄懂現有專案結構和 邏輯。view層負責把資料顯示出來,包括每一幀的具體資料,和骨骼父子關係等 model,collection會負責資料的驗證和訪問。每當使用者操作時,...