12.【题解】选拔队员
题解
题意
- 有
个位置,假设人无限并且没有区别,将男女放进 个位置中,其中女生不能相邻,有多少种方案。
题解
- 第一眼排列组合,第二眼不可做题,第三眼斐波那契。
- 当我们大胆的手膜样例,
……这不是斐波那契数列 ?打完发现还真是。 - 为啥会这样呢?
(管他干嘛,切题最重要。 ) - 但是矩阵开
就可以了,如果开 会直接 掉。
代码
- 其实不给代码好像也没什么关系?
不要打开 qwq
#include<bits/stdc++.h> #define int long long #define N (2) #define I i #define J j #define raed read #define reaD read #define reAD read #define rEAD read #define READ read #define REAd read #define REad read #define Read read #define Reda read #define redA read #define reDA read #define redA read #define itn signed #define Itn signed #define ITN signed #define Int signed #define INT signed #define foR for #define fot for #define foT for #define sort stable_sort using namespace std; namespace IO { #define ll long long const int MAX=1<<24; char buf[MAX],*p1=buf,*p2=buf; char obuf[MAX],*o=obuf; #define gc()(IO::p1==IO::p2&&(IO::p2=(IO::p1=IO::buf)+fread(IO::buf,1,1<<24,stdin),IO::p1==IO::p2)?EOF:*IO::p1++) //template<typename T> //inline T read() inline int read() { int x=0;bool f=1; char c=gc(); for(;c<48||c>57;c=gc())if(c=='-')f=0; for(;c>=48&&c<=57;c=gc())x=(x<<3)+(x<<1)+(c^48); return f?x:~x+1; } void print(ll x){if(x>9)print(x/10);*o++=(x%10)+'0';} void pit(ll x){if(x<0)*o++='-',x=~x+1;print(x);} void write(ll x,char ed){pit(x);*o++=ed;} void flush(){fwrite(obuf,o-obuf,1,stdout);} #undef ll } using IO::read;using IO::write;using IO::flush;using std::complex; inline signed min(signed x,signed y){return y&((y-x)>>31)|x&(~(y-x)>>31);} inline signed max(signed x,signed y){return x&((y-x)>>31)|y&(~(y-x)>>31);} inline long long min(long long x,long long y){return y&((y-x)>>63)|x&(~(y-x)>>63);} inline long long max(long long x,long long y){return x&((y-x)>>63)|y&(~(y-x)>>63);} inline void swap(int &x,int &y){x^=y^=x^=y;} int n,m,k; void init_set() { #ifndef ONLINE_JUDGE freopen("in.txt","r",stdin); freopen("out.txt","w",stdout); #endif // ios::sync_with_stdio(0); // cin.tie(0),cout.tie(0); } /* namespace hs { int hs[N],to[N],nxt[N]; int mod=98317,head[N],cnmhs; void clean(){memset(head,0,sizeof(head));} void add(int x,int P=mod) { hs[++cnmhs]=x,to[cnmhs]=P,x%=mod, nxt[cnmhs]=head[x],head[x]=cnmhs; } int find_x(int x) { for(int i(head[x%mod]);i;i=nxt[i]) if(hs[i]==x)return to[i]; return -1; } } namespace math { int t,P,q,d; int x,y,k,ans,possible,lon; int mod[N],a[N],gt[N],nth_mod[N]; int len,prime[700010],phi[N];//线性筛欧拉函数 short mu[N]; int mtot; bitset<N>vis; int jc[N],cp[N]; long long inv[N];//乘法逆元 long long qpow(long long x,int b,int P=P) { long long ans=1; for(;b;b>>=1){if(b&1)ans=(ans*x)%P;x=(x*x)%P;} return ans; }//O(log(b)) int gcd(int a,int b){return b?gcd(b,a%b):a;} int exgcd(int a,int b,int &x,int &y) { if(!b){x=1,y=0;return a;} int d=exgcd(b,a%b,y,x); y-=(a/b*x); return d; }//O(max(a,b)) int ola(int n) { int ans=n; for(int i=2;i*i<=n;++i) { if(n%i==0)ans=ans/i*(i-1); for(;n%i==0;n/=i); } if(n>1)ans=ans/n*(n-1); return ans; }//O(sqrt(n)) void eular(int n)//欧拉筛 { //memset(vis,0,sizeof(vis)); phi[1]=1; for(int i(2);i<=n;++i) { if(!vis[i]) prime[++len]=i,phi[i]=(i-1); for(int j(1);j<=len&&i*prime[j]<=n;++j) { vis[i*prime[j]]=1; if(!(i%prime[j])) {phi[i*prime[j]]=(phi[i]*prime[j]);break;} else phi[i*prime[j]]=(phi[i]*(prime[j]-1)); } } }//O(n) void mobius(int n) { //memset(vis,0,sizeof(vis)); mu[1]=1; for(int i(2);i<=n;++i) { if(!vis[i])prime[++mtot]=i,mu[i]=-1; for(int j(1);j<=mtot&&i*prime[j]<=n;++j) { vis[i*prime[j]]=1; if(!(i%prime[j])){mu[i*prime[j]]=0;break;} mu[i*prime[j]]=~mu[i]+1; } } }//O(n) void eular_mobius(int n) { //memset(vis,0,sizeof(vis)); mu[1]=phi[1]=1; for(int i(2);i<=n;++i) { if(!vis[i])prime[++len]=i,phi[i]=(i-1),mu[i]=-1; for(int j(1);j<=len&&i*prime[j]<=n;++j) { vis[i*prime[j]]=1; if(!(i%prime[j])) { phi[i*prime[j]]=(phi[i]*prime[j]); mu[i*prime[j]]=0; break; } phi[i*prime[j]]=(phi[i]*(prime[j]-1)); mu[i*prime[j]]=~mu[i]+1; } } } void niyuan1(int n,int P=P)//乘法逆元 { inv[1]=1; for(int i(2);i<=n;++i)inv[i]=((P-P/i)*inv[P%i])%P; }//O(n) int inv_it(int a,int P=P)//O(log(a)) { int d(exgcd(a,P,x,y)); return(x%P+P)%P; } int C(int n,int m,int P=P) { if(m>n)return 0; int a(1),b(1); for(int i(n-m+1);i<=n;++i)a=(a*i)%P; for(int i(2);i<=m;++i)b=(b*i)%P; return(a*qpow(b,P-2,P))%P; } int jc_C(int n,int m,int P=P) { return ((jc[n])*inv_it(jc[m])%P*inv_it(jc[n-m]))%P; } int lucas(int n,int m,int P=P) {return(!m)?1:(C(n%P,m%P,P)*lucas(n/P,m/P,P))%P;} int excrt(int n)//扩展中国剩余定理 { int mul(mod[1]);ans=a[1]; int x,y,c,d; for(int i(2);i<=n;++i) { x=y=0; c=(a[i]-ans%mod[i]+mod[i])%mod[i]; d=exgcd(mul,mod[i],x,y); if(!(c%d)) ans+=(((x+mod[i])%mod[i])*(c/d)%mod[i])*mul, mul=mul*mod[i]/gcd(mul,mod[i]), ans%=mul; else return -1; } return ans%mul; } int exlucas_jc(int n,int mod,int P=P) { if(!n)return 1; int res(1); for(int i(1);i<=P;++i)//不含因子mod[now] if(i%mod)res=(res*i)%P; res=qpow(res,n/P,P); for(int i(1);i<=n%P;++i)if(i%mod)res=(res*i)%P; return(res*(exlucas_jc(n/mod,mod,P)))%P; } int cal(int n,int m,int mod,int P=P) { int c1(exlucas_jc(n,mod,P)); int c2(exlucas_jc(m,mod,P)); int c3(exlucas_jc(n-m,mod,P)); int cnt(0); for(int i(n);i;i/=mod)cnt+=(i/mod); for(int i(m);i;i/=mod)cnt-=(i/mod); for(int i(n-m);i;i/=mod)cnt-=(i/mod); return(((qpow(mod,cnt,P)*c1)%P*inv_it(c2,P))%P*inv_it(c3,P))%P; } inline int crt(int x,int mod,int P) { return inv_it(P/mod,mod)*(P/mod)*x; } int exlucas(int n,int m,int now,int P) {return(crt(cal(n,m,nth_mod[now],mod[now]),mod[now],P));} int bsgs(int x,int y,int P=P) { if(!(x%P))return -1; x%=P,y%=P; if(y==1)return 0; int Z(sqrt(P)+1); int xx(y),yy; hs::clean(); for(int i(0);i<Z;++i,xx=(xx*x)%P)hs::add(xx,i); yy=qpow(x,Z),xx=1; for(int i(1),k;i<=Z;++i) { xx=(xx*yy)%P,k=hs::find_x(xx); if(k!=-1)return i*Z-k; } return -1; } void error_sort(int n) {for(int i(2);i<=n;++i)cp[i]=(i*cp[i-1]+((i&1)?-1:1))%P;} void jc_set(int n) {jc[0]=jc[1]=1;for(int i(2);i<=n;++i)jc[i]=(jc[i-1]*i)%P;} } namespace kill_tree { #define ls (p<<1) #define rs (p<<1|1) vector<int>e[N]; struct tt { int l,r; long long add,sum,min; }tr[N<<2]; int rt,r,cnt,head[N],f[N],d[N],root,b[N]; int siz[N],son[N],rk[N],top[N],dfn[N],cnm,a[N]; int pd[N]; void dfs1(int x,int fa) { d[x]=d[fa]+1; f[x]=fa; siz[x]=1; for(int y:e[x]) { if(y==fa)continue; dfs1(y,x); siz[x]+=siz[y]; if(siz[y]>siz[son[x]])son[x]=y; } } void dfs2(int x,int t) { top[x]=t; dfn[x]=++cnt; rk[cnt]=x; b[cnt]=a[x]; if(!son[x])return; dfs2(son[x],t); for(int y:e[x]) if(y!=f[x]&&y!=son[x]) dfs2(y,y); } int lca(int x,int y) { for(;top[x]!=top[y];x=f[top[x]]) if(d[top[x]]<d[top[y]])swap(x,y); return d[x]>d[y]?y:x; } int find(int x,int y) { for(;top[x]!=top[y];x=f[top[x]]) { if(d[top[x]]<d[top[y]])swap(x,y); if(d[top[x]]==y)return top[x]; } return d[x]<d[y]?son[x]:son[y]; } void pushup(int p) { tr[p].sum=tr[ls].sum+tr[rs].sum; tr[p].min=min(tr[ls].min,tr[rs].min); } void pushdown(int p) { if(tr[p].add) tr[ls].sum+=tr[p].add*(tr[ls].r-tr[ls].l+1), tr[rs].sum+=tr[p].add*(tr[rs].r-tr[rs].l+1), tr[ls].min+=tr[p].add,tr[rs].min+=tr[p].add, tr[ls].add+=tr[p].add,tr[rs].add+=tr[p].add, tr[p].add=0; } void build(int p,int l,int r) { tr[p].l=l,tr[p].r=r; if(l==r){tr[p].sum=tr[p].min=a[l];return;} int mid=(l+r)>>1; build(ls,l,mid),build(rs,mid+1,r); pushup(p); } void update(int p,int l,int r,long long k) { if(l<=tr[p].l&&r>=tr[p].r) { tr[p].sum+=k*(tr[p].r-tr[p].l+1); tr[p].min+=k;tr[p].add+=k; return; } int mid=(tr[p].l+tr[p].r)>>1; pushdown(p); if(l<=mid)update(ls,l,r,k); if(r>mid)update(rs,l,r,k); pushup(p); } void update_path(int p,int v,long long k) { for(;top[p]!=top[v];p=f[top[p]]) { if(d[top[p]]<d[top[v]])swap(p,v); update(1,dfn[top[p]],dfn[p],k); } if(d[p]<d[v])swap(p,v); update(1,dfn[v],dfn[p],k);//最后一段 } void upd(int x,int y,long long z) { int l=lca(x,y);int r=f[l]; update(1,dfn[x],dfn[x],z),update(1,dfn[y],dfn[y],z), update(1,dfn[l],dfn[l],~z+1),update(1,dfn[r],dfn[r],~z+1); } void update_tree(int p,long long k){update(1,dfn[p],dfn[p]+siz[p]-1,k);} long long querysum(int p,int l,int r) { long long ans=0; if(l<=tr[p].l&&r>=tr[p].r)return tr[p].sum; pushdown(p); int mid=(tr[p].l+tr[p].r)>>1; while(l<=mid)ans+=querysum(ls,l,r); if(r>mid)ans+=querysum(rs,l,r); return ans; } long long querysum_path(int p,int v) { //p,v为旧点编号 //把树链剖分成若干个重链,重链在序列中编号连续 long long ans=0; for(;top[p]!=top[v];p=f[top[p]]) { if(d[top[p]]<d[top[v]])swap(p,v); ans+=querysum(1,dfn[top[p]],dfn[p]); } if(d[p]<d[v])swap(p,v); ans+=querysum(1,dfn[v],dfn[p]); return ans; } long long querysum_tree(int x) { if(x==root)return querysum(1,1,n); else if(lca(x,root)!=x) return querysum(1,dfn[x],dfn[x]+siz[x]-1); else{int dson=find(x,root);return querysum(1,1,dfn[dson]-1),querysum(1,dfn[dson]+siz[dson],n);} } int querymin(int p,int l,int r) { int res=0x7f7f7f7f; if(tr[p].l>=l&&tr[p].r<=r)return tr[p].min; int mid=tr[p].l+tr[p].r>>1; while(l<=mid)res=min(res,querymin(ls,l,r)); if(r>mid)res=min(res,querymin(rs,l,r)); return res; } #undef ls #undef rs } namespace modui { int len,ans; int a[N]; int res,l,r,k; int out[N],cnt[N]; struct aa{int l,r,id;}q[N]; bool cmp(aa a,aa b) {return (a.r/len==b.r/len)?a.l<b.l:a.r<b.r;} void add(int x){ans+=(((++cnt[a[x]])<<1)-1);} void del(int x){ans-=((--cnt[a[x]]<<1)+1);} //左端点递增,每块内按照右端点排序 } namespace MST { int f[N],w; struct aa{int x,y,w;}e[N]; bool cmp(aa x,aa y){return x.w<y.w;} int find(int x){if(x==f[x])return x;return f[x]=find(f[x]);} void unionf(int x,int y){x=find(x),y=find(y);f[x]=y;} } namespace Graph { bitset<N>flag; int dis[N],head[N],cnt; struct ee{int nxt,to,w;}e[N<<1]; void add(int u,int v,int w) {e[++cnt]={head[u],v,w};head[u]=cnt;} void spfa(int x) { int now; deque<int>q; for(int i(0);i<=n;++i)flag[i]=false; for(int i(0);i<=n;i++)dis[i]=100000000; dis[x]=0; q.push_back(x); flag[x]=true; for(;!q.empty();) { now=q.front(); flag[now]=false; q.pop_front(); if(!q.empty()&&dis[q.front()]>dis[q.back()]) { int tmp=q.front(); q.pop_front(); q.push_front(q.back()); q.pop_back(); q.push_back(tmp); } for(int i(head[now]);i;i=e[i].nxt) { int s=e[i].to; if(dis[s]>dis[now]+e[i].w) { dis[s]=dis[now]+e[i].w; if(!flag[s]) { if(!q.empty()&&dis[q.front()]>dis[q.back()]) { int tmp=q.front(); q.pop_front(); q.push_front(q.back()); q.pop_back(); q.push_back(tmp); } if(!q.empty()&&dis[q.front()]<dis[s]) q.push_back(s),flag[s]=true; else q.push_front(s),flag[s]=true; } } } } } void dijkstra(int x) { int k; priority_queue<pair<int,int>>q; for(int i(0);i<=n;i++)dis[i]=0x3f3f3f3f; for(int i(0);i<=n;++i)flag[i]=false; dis[x]=0; q.push(make_pair(0,x)); while(!q.empty()) { k=q.top().second; q.pop(); if(!flag[k]) { flag[k]=true; for(int i(head[k]);i;i=e[i].nxt) { int to=e[i].to; if(dis[to]>dis[k]+e[i].w) { dis[to]=dis[k]+e[i].w; q.push(make_pair(~dis[to]+1,to)); } } } } } } namespace _01Trie { int ch[N][2],maxsiz(1<<30),cnt; inline void add(int val) { int rt(0); for(int i(maxsiz);i;i>>=1) { bool x(val&i);//查看该位是几 if(!ch[rt][x])ch[rt][x]=++cnt; rt=ch[rt][x]; } } inline int query(int val) { int ans(0),rt(0); for(int i(maxsiz);i;i>>=1) { bool x(val&i);//查看该位是几 if(ch[rt][x^1])ans=ans<<1|1,rt=ch[rt][x^1]; else ans<<=1,rt=ch[rt][x]; } return ans; } } namespace Trie { #define M 63 int t[N][M],siz,ed[N]; void init() { for(int i(0);i<=siz;++i)for(int j(0);j<=62;++j)t[i][j]=0; for(int i(1);i<=siz;++i)ed[i]=0; siz=0; } int getac(char ch) { if(ch>='a'&&ch<='z')return ch-'a'; if(ch>='A'&&ch<='Z')return ch-'A'+26; if(ch>='0'&&ch<='9')return ch-'0'+52; return 0; } void insert(string s) { int rt(0),len(s.size()); for(int i(0);i<len;++i) { int x(getac(s[i])); if(!t[rt][x])t[rt][x]=++siz; rt=t[rt][x]; } ++ed[rt]; } int find(string s) { int rt(0),len(s.size()); for(int i(0);i<len;++i) { int x(getac(s[i])); if(!t[rt][x])return 0; rt=t[rt][x]; } return ed[rt]; } #undef M } namespace Manacher { string s,t; int p[N]; int manacher() { t="$#"; for(int i(0);i<s.size();++i) t+=s[i],t+="#"; int mx(0),id(0),adolf(0),hitler(0); for(int i(1);i<t.size();++i) { p[i]=mx>i?min(p[(id<<1)-i],mx-i):1; for(;t[i+p[i]]==t[i-p[i]];++p[i]); if(mx<i+p[i])mx=i+p[i],id=i; if(adolf<p[i])adolf=p[i],hitler=i; } return adolf-1; } } namespace Splay { int root,tot; struct splay{int fa,ch[2],val,cnt,siz;}t[N]; void update(int x) { t[x].siz=t[t[x].ch[0]].siz+t[t[x].ch[1]].siz+t[x].cnt; } void rotate(int x) { int y(t[x].fa),z(t[y].fa),k(t[y].ch[1]==x); t[z].ch[t[z].ch[1]==y]=x; t[x].fa=z; t[y].ch[k]=t[x].ch[k^1]; t[t[x].ch[k^1]].fa=y; t[x].ch[k^1]=y; t[y].fa=x; update(y),update(x); } void turn(int x,int king) { for(;t[x].fa!=king;) { int y(t[x].fa),z(t[y].fa); if(z!=king) (t[z].ch[0]==y)^(t[y].ch[0]==x)?rotate(x):rotate(y); rotate(x); } if(!king)root=x; } inline void find(int x) { int u(root); if(!u)return; for(;t[u].ch[x>t[u].val]&&x!=t[u].val;u=t[u].ch[x>t[u].val]); turn(u,0); } inline void insert(int x) { int u(root),fa(0); for(;u&&t[u].val!=x;)fa=u,u=t[u].ch[x>t[u].val]; if(u)++t[u].cnt; else { u=++tot; if(fa)t[fa].ch[x>t[fa].val]=u; t[u].ch[0]=t[u].ch[1]; t[tot].fa=fa; t[tot].val=x; t[tot].cnt=1; t[tot].siz=1; } turn(u,0); } inline int Next(int x,bool f)//前驱(0),后继(1) { find(x); int u(root); if((t[u].val>x&&f)||(t[u].val<x&&!f))return u; u=t[u].ch[f]; for(;t[u].ch[f^1];u=t[u].ch[f^1]); return u; } inline void Delete(int x) { int las(Next(x,0)),nxt(Next(x,1)); turn(las,0),turn(nxt,las); int del=t[nxt].ch[0]; if(t[del].cnt>1)--t[del].cnt,turn(del,0); else t[nxt].ch[0]=0; } inline int Kth(int x) { int u(root); if(t[u].siz<x)return 0; for(;1;) { int y=t[u].ch[0]; if(x>t[y].siz+t[u].cnt) x-=t[y].siz+t[u].cnt,u=t[u].ch[1]; else if(t[y].siz>=x)u=y; else return t[u].val; } } } namespace Art_Splay { struct Splay{int s[2],p,v,siz,tag;}t[2000010]; int root,idx; void pushup(int x) {t[x].siz=t[t[x].s[0]].siz+t[t[x].s[1]].siz+1;} void pushdown(int x) { if(t[x].tag) swap(t[x].s[0],t[x].s[1]), t[t[x].s[0]].tag^=1, t[t[x].s[1]].tag^=1, t[x].tag=0; } void rotate(int x) { int y(t[x].p),z(t[y].p),k(t[y].s[1]==x); t[z].s[t[z].s[1]==y]=x; t[x].p=z; t[y].s[k]=t[x].s[k^1]; t[t[x].s[k^1]].p=y; t[x].s[k^1]=y; t[y].p=x; pushup(y),pushup(x); } void turn(int x,int k) { for(;t[x].p!=k;) { int y(t[x].p),z(t[y].p); if(z!=k) (t[z].s[0]==y)^(t[y].s[0]==x)?rotate(x):rotate(y); rotate(x); } if(!k)root=x; } inline void insert(int x) { int u(root),p(0); for(;u;)p=u,u=t[u].s[x>t[u].v]; u=++idx; t[p].s[x>t[p].v]=u; t[idx].p=p; t[idx].v=x; t[idx].siz=1; turn(u,0); } inline int Kth(int x) { int u(root); for(;1;) { pushdown(u); int y=t[u].s[0]; if(x>t[y].siz+1) x-=t[y].siz+1,u=t[u].s[1]; else if(t[y].siz>=x)u=y; else return u; } } void output(int x) { pushdown(x); if(t[x].s[0])output(t[x].s[0]); if(t[x].v>=1&&t[x].v<=n)write(t[x].v,' '); if(t[x].s[1])output(t[x].s[1]); } } namespace BB_Splay { int a[N],root[N],idx,bin[N],btop,op,l,r,x,y,z; struct splay{int s[2],v,fa,siz,cnt;}t[N]; int New(int x) { int u(btop?bin[btop--]:++idx); t[u].v=x,t[u].cnt=t[u].siz=1, t[u].fa=t[u].s[0]=t[u].s[1]=0; return u; } void update(int u) {t[u].siz=t[t[u].s[0]].siz+t[t[u].s[1]].siz+t[u].cnt;} void rotate(int x) { int y(t[x].fa),z(t[y].fa),k(t[t[x].fa].s[1]==x); if(z)t[z].s[t[t[y].fa].s[1]==y]=x; t[x].fa=z,t[y].s[k]=t[x].s[k^1],t[t[y].s[k]].fa=y; t[x].s[k^1]=y,t[y].fa=x; update(y),update(x); } void turn(int x) { for(int y(t[x].fa),z(t[y].fa);t[x].fa;y=t[x].fa,z=t[y].fa) { if(z)(t[y].s[0]==x)^(t[z].s[0]==y)?rotate(x):rotate(y); rotate(x); } update(x); } int getnum(int x,int k) { int u(root[k]),v(0); for(v=u;u;v=u) { if(t[u].v==x)return u; if(x<t[u].v)u=t[u].s[0]; else u=t[u].s[1]; } return v; } int Kth(int x,int k) { int u(root[k]); for(;u;) { if(x<=t[t[u].s[0]].siz)u=t[u].s[0]; else if(x>t[t[u].s[0]].siz+t[u].cnt) x-=t[t[u].s[0]].siz+t[u].cnt,u=t[u].s[1]; else return u; } return 0; } int getless(int x,int k) { int u(root[k]),cur(0); for(;u;) if(t[u].v<x) cur+=t[u].cnt+t[t[u].s[0]].siz,u=t[u].s[1]; else u=t[u].s[0]; return cur; } int getmax(int u){for(;t[u].s[1];u=t[u].s[1]);return u;} int getmin(int u){for(;t[u].s[0];u=t[u].s[0]);return u;} int getpre(int x,int k) { int u(getnum(x,k)); if(!u)return -2147483647; turn(u),root[k]=u; if(t[u].v>=x)u=getmax(t[u].s[0]); return u?t[u].v:-2147483647; } int getnext(int x,int k) { int u(getnum(x,k)); if(!u)return 2147483647; turn(u),root[k]=u; if(t[u].v<=x)u=getmin(t[u].s[1]); return u?t[u].v:2147483647; } void insert(int x,int k) { int u(getnum(x,k)); if(t[u].v==x) { turn(u),root[k]=u; ++t[u].cnt,++t[u].siz; return; } u=New(x); if(!root[k]){root[k]=u;return;} int v(root[k]),w(0),dir(0); for(w=v;v;w=v) if(t[u].v<=t[v].v)dir=1,v=t[v].s[0]; else dir=0,v=t[v].s[1]; if(dir)t[w].s[0]=u; else t[w].s[1]=u; t[u].fa=w,turn(u),root[k]=u; } void Delete(int x,int k) { int u(getnum(x,k)); turn(u);root[k]=u; if(t[u].cnt>1){--t[u].cnt,--t[u].siz;return;} if(t[u].siz==1)root[k]=0; else if(!t[u].s[0]||!t[u].s[1]) root[k]=t[u].s[0]|t[u].s[1],t[root[k]].fa=0; else { t[t[u].s[0]].fa=0; int v(getmax(t[u].s[0])); turn(v);root[k]=v; t[v].s[1]=t[u].s[1],t[t[u].s[1]].fa=v,update(v); } bin[++btop]=u; } #define ls (p<<1) #define rs (p<<1|1) void build(int p,int l,int r) { for(int i(l);i<=r;++i)insert(a[i],p); if(l==r)return; int mid(l+r>>1); build(ls,l,mid),build(rs,mid+1,r); } void segchange(int p,int l,int r,int v,int k) { Delete(a[k],p),insert(v,p); if(l==r)return; int mid(l+r>>1); if(k<=mid)segchange(ls,l,mid,v,k); else segchange(rs,mid+1,r,v,k); } int segless(int p,int l,int r,int kl,int kr,int v) { if(l==kl&&r==kr)return getless(v,p); int mid(l+r>>1); if(kr<=mid)return segless(ls,l,mid,kl,kr,v); else if(kl>mid)return segless(rs,mid+1,r,kl,kr,v); else return segless(ls,l,mid,kl,kr,v)+segless(rs,mid+1,r,kl,kr,v); } int segpre(int p,int l,int r,int kl,int kr,int v) { if(l==kl&&r==kr)return getpre(v,p); int mid(l+r>>1); if(kr<=mid)return segpre(ls,l,mid,kl,kr,v); else if(kl>mid)return segpre(rs,mid+1,r,kl,kr,v); else return max(segpre(ls,l,mid,kl,kr,v),segpre(rs,mid+1,r,kl,kr,v)); } int segnext(int p,int l,int r,int kl,int kr,int v) { if(l==kl&&r==kr)return getnext(v,p); int mid(l+r>>1); if(kr<=mid)return segnext(ls,l,mid,kl,kr,v); else if(kl>mid)return segnext(rs,mid+1,r,kl,kr,v); else return min(segnext(ls,l,mid,kl,kr,v),segnext(rs,mid+1,r,kl,kr,v)); } int segKth(int kl,int kr,int k) { int L(0),R(1e8+10); for(;L<R;) { int mid=(L+R+1)>>1; if(segless(1,1,n,kl,kr,mid)>k-1)R=mid-1; else L=mid; } return L; } #undef ls #undef rs } namespace AC_Auto { #define M 27 string d,dd; int cnt; struct aa{bool ed;int son[M],nxt;}t[N]; queue<int>q; void insert(string d) { int u(0),len(d.size()); for(int i(0);i<len;++i) { int v(d[i]-'A'); if(!t[u].son[v])t[u].son[v]=++cnt; u=t[u].son[v]; } t[u].ed=1; return; } void nxt_set() { for(int i(0);i<26;++i)if(t[0].son[i])q.push(t[0].son[i]); for(;q.size();) { int u(q.front());q.pop(); int Nxt(t[u].nxt); for(int i(0);i<26;++i) { int v(t[u].son[i]); if(!v){t[u].son[i]=t[Nxt].son[i];continue;} t[v].nxt=t[Nxt].son[i]; t[v].ed|=t[t[v].nxt].ed; //假如失配指针是个终止节点, //由于失配指针的前缀和当前字符串后缀相同, //所以实际上另一个字符串已经结束了。 q.push(v); } } } #undef M } #undef N #define N (200010) namespace Bipartite_Graph { bitset<N>flag; int matx[N],maty[N]; int dis[N],head[N],cnt; struct aa{int nxt,to,w;}e[N<<1]; void add(int u,int v,int w) {e[++cnt]={head[u],v,w};head[u]=cnt;} bool hungarian(int x) { for(int i(head[x]),y;i;i=e[i].nxt) { if(!flag[y=e[i].to]) { flag[y]=true; if(!maty[y]||hungarian(maty[y])) { matx[x]=y,maty[y]=x; return true; } } } return false; } int Hungary() { int tot(0); for(int i(1);i<=n;++i) { for(int j(1);j<=n;++j)flag[j]=false; if(hungarian(i))++tot; } return tot; } } namespace Network_flow { bitset<N>flag; int s,t,maxf; int incf[N],pre[N]; int dis[N],head[N],cnt(1); struct aa{int nxt,to,w;}e[N<<1]; void add(int u,int v,int w) {e[++cnt]={head[u],v,w};head[u]=cnt;} namespace Edmond_karp { bool bfs() { for(int i(0);i<=(n*m+1)<<1;++i)flag[i]=false; queue<int>q; incf[s]=1<<30; q.push(s),flag[s]=true; for(;q.size();) { int x(q.front());q.pop(); for(int i(head[x]);i;i=e[i].nxt) if(e[i].w) { int y(e[i].to); if(flag[y])continue; incf[y]=min(incf[x],e[i].w); pre[y]=i; q.push(y),flag[y]=true; if(y==t)return true; } } return false; } void update() { int x(t); for(int i(pre[x]);x^s;x=e[i^1].to,i=pre[x]) e[i].w-=incf[t],e[i^1].w+=incf[t]; maxf+=incf[t]; } } namespace Dinic { int now[N],d[N]; bool bfs() { for(int i(0);i<=(n*m+1)<<1;++i)d[i]=0; queue<int>q; q.push(s),d[s]=1,now[s]=head[s]; for(;q.size();) { int x(q.front());q.pop(); for(int i(head[x]);i;i=e[i].nxt) if(e[i].w&&!d[e[i].to]) { int y(e[i].to); q.push(y); now[y]=head[y]; d[y]=d[x]+1; if(y==t)return true; } } return false; } int dinic(int x,int flow) { if(x==t)return flow; int rest(flow),k; for(int i(now[x]);i&&rest;i=e[i].nxt) { now[x]=i; if(e[i].w&&d[e[i].to]==d[x]+1) { int y(e[i].to); k=dinic(y,min(rest,e[i].w)); if(!k)d[y]=0; e[i].w-=k; e[i^1].w+=k; rest-=k; } } return flow-rest; } } } namespace zkw_Segment_tree { int len(1),inf((1ll<<31)-1); struct segment_tree { int sum,min,max,add; }t[N<<1]; inline void build() { for(;len<=n+1;len<<=1);// 或许需要大于n+1 for(int i(len+1);i<=len+n;++i) t[i].sum=t[i].min=t[i].max=read(); for(int i(len-1);i;--i) t[i].sum=t[i<<1].sum+t[i<<1|1].sum, t[i].min=min(t[i<<1].min,t[i<<1|1].min), t[i<<1].min-=t[i].min, t[i<<1|1].min-=t[i].min, t[i].max=max(t[i<<1].max,t[i<<1|1].max), t[i<<1].max-=t[i].max, t[i<<1|1].max-=t[i].max; } inline void update(int p,int v) { int x; for(p+=len;p;p>>=1) t[p].sum+=v,t[p].min+=v,t[p].max+=v, x=min(t[p].min,t[p^1].min),t[p].min-=x, t[p^1].min-=x,t[p>>1].min+=x, x=max(t[p].max,t[p^1].max),t[p].max-=x, t[p^1].max-=x,t[p>>1].max+=x; } inline void update(int l,int r,int v) { if(l==r){update(l,v);return;} int lc(0),rc(0),pos(1),tmp; for(l+=len-1,r+=len+1;l^r^1;l>>=1,r>>=1,pos<<=1) { t[l].sum+=lc*v,t[r].sum+=rc*v; if(~l&1)t[l^1].sum+=pos*v,t[l^1].add+=v,lc+=pos; if(r&1)t[r^1].sum+=pos*v,t[r^1].add+=v,rc+=pos; tmp=min(t[l].min,t[l^1].min),t[l].min-=tmp, t[l^1].min-=tmp,t[l>>1].min+=tmp, tmp=min(t[r].min,t[r^1].min),t[r].min-=tmp, t[r^1].min-=tmp,t[r>>1].min+=tmp, tmp=max(t[l].max,t[l^1].max),t[l].max-=tmp, t[l^1].max-=tmp,t[l>>1].max+=tmp, tmp=max(t[r].max,t[r^1].max),t[r].max-=tmp, t[r^1].max-=tmp,t[r>>1].max+=tmp; } for(;l;l>>=1,r>>=1) t[l].sum+=lc*v,t[r].sum+=rc*v, tmp=min(t[l].min,t[l^1].min),t[l].min-=tmp, t[l^1].min-=tmp,t[l>>1].min+=tmp, tmp=max(t[l].max,t[l^1].max),t[l].max-=tmp, t[l^1].max-=tmp,t[l>>1].max+=tmp; } inline int querysum(int l,int r) { int ans(0),lc(0),rc(0),pos(1); for(l+=len-1,r+=len+1;l^r^1;l>>=1,r>>=1,pos<<=1) { ans+=t[l].add*lc+t[r].add*rc; if(~l&1)ans+=t[l^1].sum,lc+=pos; if(r&1)ans+=t[r^1].sum,rc+=pos; } for(;l;l>>=1,r>>=1)ans+=t[l].add*lc+t[r].add*rc; return ans; } inline int querymin(int l,int r) { int lans(0),rans(0),ans(0); if(l==r) { for(l+=len;l;l>>=1) lans+=t[l].min; return lans; } for(l+=len,r+=len;l^r^1;l>>=1,r>>=1) { lans+=t[l].min,rans+=t[r].min; if(~l&1)lans=min(lans,t[l^1].min); if(r&1)rans=min(rans,t[r^1].min); } for(ans=min(lans+t[l].min,rans+t[r].min);l>1;ans+=t[l>>=1].min); return ans; } inline int querymax(int l,int r) { int lans(0),rans(0),ans(0); if(l==r) { for(l+=len;l;l>>=1) lans+=t[l].max; return lans; } for(l+=len,r+=len;l^r^1;l>>=1,r>>=1) { lans+=t[l].max,rans+=t[r].max; if(~l&1)lans=max(lans,t[l^1].max); if(r&1)rans=max(rans,t[r^1].max); } for(ans=max(lans+t[l].max,rans+t[r].max);l>1;ans+=t[l>>=1].max); return ans; } } namespace martix { struct aa { int g[N][N],x,y; void clear(){memset(g,0,sizeof(g));} }furina,fucaros,fontaine,sumeru; aa cal(aa a,aa b,aa&c,int t,int q,int l,int P=P) { c.x=t,c.y=l; c.clear(); for(int i(1);i<=t;++i) for(int j(1);j<=q;++j) for(int k(1);k<=l;++k) (c.g[i][k]+=a.g[i][j]*b.g[j][k])%=P; return c; } aa operator *(const aa&a,const aa&b) { aa c; c.clear(); return cal(a,b,c,a.x,a.y,b.y,P); } int qpow(int b,int P=P) { furina.g[1][1]=furina.g[1][2]=1; furina.x=1,furina.y=2; sumeru=fucaros; for(;b;b>>=1) { if(b&1) furina=furina*sumeru; sumeru=sumeru*sumeru; } return furina.g[1][1]; } } */ #undef N #define N (3) int P; namespace martix { struct aa { int g[N][N],x,y; void clear() { for(int i(1);i<=x;++i) for(int j(1);j<=y;++j) g[i][j]=0; } }furina,fucaros,fontaine,sumeru; aa cal(aa a,aa b,aa&c,int t,int q,int l,int P=P) { c.x=t,c.y=l; c.clear(); for(int i(1);i<=t;++i) for(int j(1);j<=q;++j) for(int k(1);k<=l;++k) (c.g[i][k]+=a.g[i][j]*b.g[j][k])%=P; return c; } aa operator *(const aa&a,const aa&b) { aa c; c.clear(); return cal(a,b,c,a.x,a.y,b.y,P); } int qpow(int b,int P=P) { furina.g[1][1]=furina.g[1][2]=1; furina.x=1,furina.y=2; sumeru=fucaros; for(;b;b>>=1) { if(b&1) furina=furina*sumeru; sumeru=sumeru*sumeru; } return furina.g[1][1]; } } using namespace martix; int panzer; int solve() { int ans(qpow(n)%P); return ans; } signed main() { init_set(); int t(read());P=read(); fucaros.g[1][1]=fucaros.g[1][2]=fucaros.g[2][1]=1; fucaros.x=2,fucaros.y=2; for(;t;--t) { n=read(); write(solve(),'\n'); } flush(); return 0; } //WC就是斐波那契数 //手膜样例 /* 1:2 2:3 3:5 4:8 5:13 6:21 */ //但是你真的打开了 qwq
代码
#include<bits/stdc++.h> #define int long long #define N (2) #define sort stable_sort using namespace std; namespace IO { #define ll long long const int MAX=1<<24; char buf[MAX],*p1=buf,*p2=buf; char obuf[MAX],*o=obuf; #define gc()(IO::p1==IO::p2&&(IO::p2=(IO::p1=IO::buf)+fread(IO::buf,1,1<<24,stdin),IO::p1==IO::p2)?EOF:*IO::p1++) //template<typename T> //inline T read() inline int read() { int x=0;bool f=1; char c=gc(); for(;c<48||c>57;c=gc())if(c=='-')f=0; for(;c>=48&&c<=57;c=gc())x=(x<<3)+(x<<1)+(c^48); return f?x:~x+1; } void print(ll x){if(x>9)print(x/10);*o++=(x%10)+'0';} void pit(ll x){if(x<0)*o++='-',x=~x+1;print(x);} void write(ll x,char ed){pit(x);*o++=ed;} void flush(){fwrite(obuf,o-obuf,1,stdout);} #undef ll } using IO::read;using IO::write;using IO::flush; inline signed min(signed x,signed y){return y&((y-x)>>31)|x&(~(y-x)>>31);} inline signed max(signed x,signed y){return x&((y-x)>>31)|y&(~(y-x)>>31);} inline long long min(long long x,long long y){return y&((y-x)>>63)|x&(~(y-x)>>63);} inline long long max(long long x,long long y){return x&((y-x)>>63)|y&(~(y-x)>>63);} inline void swap(int &x,int &y){x^=y^=x^=y;} int n,m,k; void init_set() { #ifndef ONLINE_JUDGE freopen("in.txt","r",stdin); freopen("out.txt","w",stdout); #endif // ios::sync_with_stdio(0); // cin.tie(0),cout.tie(0); } #undef N #define N (3) int P; namespace martix { struct aa { int g[N][N],x,y; void clear() { for(int i(1);i<=x;++i) for(int j(1);j<=y;++j) g[i][j]=0; } }furina,fucaros,fontaine,sumeru; aa cal(aa a,aa b,aa&c,int t,int q,int l,int P=P) { c.x=t,c.y=l; c.clear(); for(int i(1);i<=t;++i) for(int j(1);j<=q;++j) for(int k(1);k<=l;++k) (c.g[i][k]+=a.g[i][j]*b.g[j][k])%=P; return c; } aa operator *(const aa&a,const aa&b) { aa c; c.clear(); return cal(a,b,c,a.x,a.y,b.y,P); } int qpow(int b,int P=P) { furina.g[1][1]=furina.g[1][2]=1; furina.x=1,furina.y=2; sumeru=fucaros; for(;b;b>>=1) { if(b&1) furina=furina*sumeru; sumeru=sumeru*sumeru; } return furina.g[1][1]; } } using namespace martix; int panzer; int solve() { int ans(qpow(n)%P); return ans; } signed main() { init_set(); int t(read());P=read(); fucaros.g[1][1]=fucaros.g[1][2]=fucaros.g[2][1]=1; fucaros.x=2,fucaros.y=2; for(;t;--t) { n=read(); write(solve(),'\n'); } flush(); return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】