小a的旅行计划
來源:牛客網
時間限制:C/C++ 1秒,其他語言2秒 空間限制:C/C++ 32768K,其他語言65536K 64bit IO Format: %lld文章目錄
- 題目描述
- 題解:
- 代碼:
題目描述
小a終于放假了,它想在假期中去一些地方游玩,現在有N個景點,編號為1, 2, \dots
N1,2,…N,同時小b也想出去游玩。由于一些特殊♂原因,他們的旅行計劃必須滿足一些條件 首先,他們可以從這N個景點中任意選幾個游玩
設小a選出的景點集合為A,小b選的景點集合為B,則需要滿足
輸入描述:
一個整數N表示景點的數量
輸出描述:
一個整數表示方案數,答案對108 + 7取模
示例1
輸入
輸出
3說明
合法的方案如下:
小a:(1, 2) 小b: (2, 3)
小a:(1, 3) 小b: (2, 3)
小a:(1, 2) 小b: (1, 3)
示例2
輸入
復制
輸出
復制
示例3
輸入
復制
輸出
復制
示例4
輸入
復制
輸出
復制
示例5
輸入
輸出
0備注:
對于100%的數據1?n?10 13
題解:
解題思路來自
我們整合一下題目的條件可以得到,A和B都至少有兩個元素,且最少有一個相同,至少有一個不同
一共n的元素,我們可以先選出A的元素,然后在A中選一些元素作為公共元素,然后在A未選的元素中選擇給B
可以得到公式
我們注意到公式中存在除法操作,且我們需要mod,所以用逆元來算
求逆元的方法:
代碼:
#include<iostream> #include<cstdio> using namespace std; typedef long long ll; const ll mod=1e8+7; ll exgcd(ll a,ll b,ll &x,ll &y)//擴展歐幾里得算法 {if(b==0){x=1;y=0;return a; //到達遞歸邊界開始向上一層返回}ll gcd=exgcd(b,a%b,x,y);ll y1=y; //把x y變成上一層的ll x1=x;y=x1-(a/b)*y1;x=y1;return gcd; //得到a b的最大公因數 } ll inv(ll a,ll mod){ll x,y;ll gcd=exgcd(a,mod,x,y);if(gcd!=1)return -1;else return (x+mod)%mod; } ll poww(ll a,ll b){ll ans=1;ll base=a%mod;while(b){if(b&1)ans=ans*base%mod;base=base*base%mod;b>>=1;}return ans%mod; } //ll inv(ll a,ll mod){ // return poww(a,mod-2); //} int main() {ll n;cin>>n; // cout<<poww(2,3)<<endl;ll ans1=((poww(4,n)-1)-(poww(3,n+1))+mod)%mod;ll ans2=3*poww(2,n-1)%mod;ll ans3=inv(2,mod)%mod;cout<<(ans1*ans3+ans2)%mod;return 0; } 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
- 上一篇: 逆元的求法
- 下一篇: cario java_Cairo图形库