Wannafly挑战赛18
Wannafly挑戰賽18
A. 序列
先考慮暴力,相鄰兩個樹之間乘上給定的三種數,遞推出下一個位置填什么,然后再check一下,最后一位是否為1即可。這樣時間顯然不行,但是給我們一種思路,就是中間的轉換關系,確定唯一一個序列。現在的目標是讓最后一位出現1,可以如果不管1,由-2和0.5取湊出1需要兩個-2和兩個0.5。那所有的轉換中,就只要保證有若干組(-2,-2,0.5,0.5)存在,其他地方為1即可。具體公式見代碼
#include <bits/stdc++.h> #define rep(i,a,b) for(int i=a;i<=b;++i) #define pb push_back #define mem(W) memset(W,0,sizeof(W)) typedef long long ll; inline int read() {char c=getchar();int x=0,f=1;while(!isdigit(c)){if(f=='-')f=-1;c=getchar();}while(isdigit(c)){x=x*10+c-'0';c=getchar();}return x*f; } using namespace std; double a[1111]; int n; const int mod = 1e9 + 7; ll ans,c[1111][1111]; ll C(int n,int m){return c[n][m]; } int main() {scanf("%d",&n);rep(i,0,n)c[i][0]=c[i][i]=1;rep(i,1,n)rep(j,1,i){c[i][j]=(c[i-1][j-1]+c[i-1][j])%mod;}rep(i,0,(n-1)/4){ans = (ans + (C(n-1,i*4)*C(4*i,2*i))%mod)%mod;}printf("%lld\n",ans);return 0; }B. 隨機數
設\(P_n\)是前n次出現奇數次的概率,單次出現1的概率\(X = \frac{a}{10000}\), 那么有
\[P_n=(1-X)P_{n-1}+X(1-P_{n-1})=(1-2X)P_{n-1}+X, P_0=0\]
由中學數學可知,通項為:\(P_n=\frac{1-(1-2X)^n}{2}\)
之后發現n很大,所以我膽子很大的用java寫了快速冪......單次運算復雜度太高TLE,實際上碰見這種指數項遠大于模數的情況第一個就該想到循環節,對于mod為素數(mod-1)就是循環節,然后就可以把n降低,直接套公式即可。
C. 異或和
思考如何快速求出一個位置的期望,曼哈頓距離常見套路,把x,y拆開考慮,那么把x,y都投影到坐標軸上,分別預處理每個位置左右兩邊的1到它的距離和,o(n)預處理,然后枚舉一下就解決了。
#include <bits/stdc++.h> #define rep(i,a,b) for(int i=a;i<=b;++i) #define frep(i,a,b) for(int i=a;i>=b;--i) #define pb push_back #define mem(W) memset(W,0,sizeof(W)) typedef long long ll; inline int read() {char c=getchar();int x=0,f=1;while(!isdigit(c)){if(f=='-')f=-1;c=getchar();}while(isdigit(c)){x=x*10+c-'0';c=getchar();}return x*f; } using namespace std; const int N = 2000+50; int n,m; const int mod = 1e9 + 7; ll q_pow(ll a,ll b){ll ans=1;while(b){if(b&1)ans=(ans*a)%mod;a=(a*a)%mod;b>>=1;}return ans; } char s[2002]; ll num,X[N],Y[N],LX[N],RX[N],LY[N],RY[N]; int main() {scanf("%d%d",&n,&m);rep(i,1,n){scanf(" %s",s+1);rep(j,1,m)if(s[j]=='1'){++X[i];++Y[j];++num;}}int t=X[1];rep(i,2,n){LX[i] = (LX[i-1] + t)%mod;t=(t+X[i])%mod;}t=Y[1];rep(i,2,m){LY[i]=(LY[i-1]+t)%mod;t=(t+Y[i])%mod;}t=X[n];frep(i,n-1,1){RX[i] = (RX[i+1] + t)%mod;t=(t+X[i])%mod;}t=Y[m];frep(i,m-1,1){RY[i] = RY[i+1] + t;t=(t+Y[i])%mod;}ll ans=0;rep(i,1,n)rep(j,1,m){ll tmp = (((RX[i]+LX[i]+RY[j]+LY[j])%mod*q_pow(num,mod-2))%mod)%mod;ans^=tmp;}printf("%lld\n",ans);return 0; }轉載于:https://www.cnblogs.com/RRRR-wys/p/9216028.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的Wannafly挑战赛18的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 主席树学习笔记
- 下一篇: Codeforces Round #49