小b寫了乙個程式,隨機生成了n個正整數,分別是a[1]..a[n],他取出了其中一些數,並把它們乘起來之後模p,得到了餘數c。但是沒過多久,小b就忘記他選了哪些數,他想把所有可能的取數方案都找出來。你能幫他計算一下一共有多少種取數方案嗎?請把最後的方案數模1000000007後輸出。
小b記得他至少取了乙個數。
第一行三個正整數n,p,c,含義如題目所述。
接下來一行有n個正整數,表示生成的n個隨機數。
乙個數,方案數模1000000007。
2 7 21 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會負責資料的驗證和訪問。每當使用者操作時,...