2019山东省赛复现补题
D - Game on a Graph
题意:有t个测试样例,给k个人分成两组,在一个n个点m条边的连通图中按顺序轮流取走一条边,那一组导致图无法联通就输了,第一组赢了输出1,第二组赢了输出2
题解:在n个点的图中,要保持联通至少需要n-1个点,当要取到第n-1条边时就输了。看看是那一组取到第n-1条边就可以判断,最多可以取走x条边(n-x=m-1,x=n-m+1),谁取走下一条边就输了
#include<iostream> #include<cmath> using namespace std; int main(){ ios::sync_with_stdio(false); int t; cin>>t; while(t--){ int k,n,m,temp,u,v; string s; cin>>k>>s>>n>>m; if(m>=n-1){ temp=(m-n+1)%k; } for(int i=1;i<=m;i++){ cin>>u>>v; } if(s[temp]=='1'){ cout<<2<<endl; }else{ cout<<1<<endl; } } return 0; }
K - Happy Equation
题意:ax≡xa(mod 2p)(ax与xa模2p同余),给a和p求有多少满足条件的x.
题解:令m=2p,m为偶数
1.当a为奇数时,只有一种情况,a=x时符合
2.当a为偶数时,设a=2n,则ax=2x * nx,因为ax%m=xa%m,所以x也为偶数。
1)当x小于p时,单独求满足条件的x;
2)当x>p时,ax%m=0,则若要满足条件,则xa%m=0,设x=2n*k,则xa=2na * ka;若要(2na * ka)%(2p)==0,就要na>=p;
即n>=p/a(向上取整),求出m以内2n的倍数个数,再减掉x小于p的部分(因为前面单独计算过)
1)+2)的结果就是最终答案
(云里雾里,大概是这样吧,真正比赛的时候我应该也做不出来,我就当锻炼锻炼我的脑子吧)
#include<iostream> #include<algorithm> #include<cstdio> #include<cmath> #include<cstring> #include<string> using namespace std; typedef long long ll; ll qpow(ll a,ll b,ll mod ){ ll ans =1%mod; while(b){ if(b&1){ ans=(ans%mod*a%mod)%mod; } a=(a%mod*a%mod)%mod; b=b>>1; // b=b/2; } return ans; } int main(){ ios::sync_with_stdio(false); int t; cin>>t; while(t--){ int a,p; ll counts=0; cin>>a>>p; if(a&1){ cout<<1<<endl; }else{ ll mod=pow(2,p); for(int i=1;i<=p;i++){ if(qpow(a,i,mod)%mod==qpow(i,a,mod)%mod){ counts++; } } ll temp=ceil(p/(a+0.0)); ll item=pow(2,temp); counts+=mod/item-p/item; cout<<counts<<endl; } } return 0; }

浙公网安备 33010602011771号