日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Wannafly挑战赛18

發布時間:2023/12/3 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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降低,直接套公式即可。

#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; ll n,a; 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[1000100]; int main() {scanf(" %lld %s",&a,s);int len=strlen(s);rep(i,0,len-1)n=(n*10+s[i]-'0')%(mod-1);ll X = (a*q_pow(10000LL,mod-2))%mod;ll ans = (1-q_pow(1-2*X,n)+mod)%mod*q_pow(2,mod-2)%mod;ans=(ans+mod)%mod;printf("%lld\n",ans);return 0; }

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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。