1. 程式人生 > >(未完成)[HDUOJ]“字節跳動-文遠知行杯”廣東工業大學第十四屆程序設計競賽

(未完成)[HDUOJ]“字節跳動-文遠知行杯”廣東工業大學第十四屆程序設計競賽

個數 中一 連續 人的 [1] 鴿子 get push_back -a

solved 5

A(簽到)

題意:兩個人隨機得到0或1其中之一數字,每個人都可以猜對方的數字是什麽,有一個人猜對就算成功,問最優策略下00,01,10,11四種情況兩人的成功概率分別是多少。

題意不明的簽到題,題面說兩人不能溝通,以為就是兩個人隨便猜,成功率都是1-0.5*0.5=0.75。結果是兩個人可以提前商量好策略,那顯然可以其中一個人猜和自己相同的數,另一個人猜和自己不同的數,那麽所有的成功率都是100%。

技術分享圖片
#include<bits/stdc++.h>
using namespace std;
#define rep(i,n) for(int i=1;i<=n;i++)
#define
LL long long #define pii pair<int,int> #define mp make_pair #define st first #define nd second #define pb push_back const int N= 1e7+7; const int inf= 3e3+7; int main(){ printf("1.00\n1.00\n1.00\n1.00\n"); system("pause"); }
View Code

0:48(2A)

B(遞推)

題意:求斐波那契數列每一項的平方的連續一段和。

題意不明的簽到題,前綴和,註意最後相減之後要加mod再模mod防止出現負數。

技術分享圖片
#include<bits/stdc++.h>
using namespace std;
#define rep(i,n) for(int i=1;i<=n;i++)
#define LL long long
#define pii pair<int,int>
#define mp make_pair
#define st first
#define nd second
#define pb push_back

const int N= 1e6+7;
const int inf= 3e3+7; const int mod=192600817; int get(int a,int b){ return a*4+b+1; } LL f[N],F[N]; int main(){ f[1]=f[2]=1; F[1]=1; F[2]=2; for(int i=3;i<=1e5;i++){ f[i]=(f[i-1]+f[i-2])%mod; F[i]=f[i]*f[i]%mod; F[i]+=F[i-1]; F[i]%=mod; } int q; while(cin>>q){ while(q--){ int a,b,c,d; cin>>a>>b>>c>>d; //if(get(a,b)==get(c,d))cout<<0<<endl; if(get(c,d)<get(a,b))cout<<(F[get(a,b)]-F[get(c,d)-1]+mod)%mod<<endl; else cout<<(F[get(c,d)]-F[get(a,b)-1]+mod)%mod<<endl; } } system("pause"); }
View Code

1:37(3A)

C(模擬)

題意:把一個數字變換為他的各數位的平方和,經過若幹次變換後這個數可以變成1,則稱他為鴿子數,求第K個鴿子數。

記憶化搜索即可。

技術分享圖片
#include<bits/stdc++.h>
using namespace std;
#define rep(i,n) for(int i=1;i<=n;i++)
#define LL long long
#define pii pair<int,int>
#define mp make_pair
#define st first
#define nd second
#define pb push_back

const int N= 1e7+7;
const int inf= 3e3+7;

int cnt;

int ans[N],vis[N],mem[N],in[N];

int solve(int x){
    if(mem[x]!=-1)return mem[x];
    if(x==1)return 1;
    if(in[x])return 0;
    in[x]=1;
    int res=x,now=0;
    while(res){
        now+=(res%10)*(res%10);
        res/=10;
    }
    mem[x]=solve(now);
    in[x]=0;
    return mem[x];
}

int main(){
    memset(mem,-1,sizeof(mem));
    for(int i=1;i<=2e6;i++)if(mem[i]==-1)mem[i]=solve(i);
    rep(i,2e6)if(mem[i])ans[++cnt]=i;
    int q;
    cin>>q;
    while(q--){
        int k;
        cin>>k;
        cout<<ans[k]<<endl;
    }

    system("pause");
}
View Code

0:33(1A)

D

E(線性代數)

題意:給出三個點的坐標,以及線性變換後三個點的新坐標(保證三點不共線),多次詢問(x,y)經過線性變換後的坐標

F

G(數學)

技術分享圖片
#include<bits/stdc++.h>
using namespace std;
#define rep(i,n) for(int i=1;i<=n;i++)
#define LL long long
#define pii pair<int,int>
#define mp make_pair
#define st first
#define nd second
#define pb push_back

const int N= 1e7+7;
const int inf= 3e3+7;
const int mod=1000000007;

LL po(LL x){
    if(x==0)return 1;
    LL res=po(x/2);
    if(x&1)return res*res%mod*2%mod;
    return res*res%mod;
}

int main(){
    LL x;
    while(cin>>x){
        cout<<(x-1)%mod * (po(x)%mod) %mod +1<<endl;
    }

    system("pause");
}
View Code

1:12(1A)

H

I

J(矩陣快速冪)

題意:f[n]=f[n-1]+2*f[n-2]+n^3,f[1]=1,f[2]=2,求f[n]。

矩陣快速冪裸題

(打了好久...)

技術分享圖片
#include<bits/stdc++.h>
using namespace std;
#define rep(i,n) for(int i=1;i<=n;i++)
#define LL long long
#define pii pair<int,int>
#define mp make_pair
#define st first
#define nd second
#define pb push_back

const int N=6;
const int inf= 3e3+7;
const int mod=123456789;
 
LL tmp[N][N];  
void multi(LL a[][N],LL b[][N],int n)  
{  
    memset(tmp,0,sizeof tmp);  
    for(int i=0;i<n;i++)  
        for(int j=0;j<n;j++)  
        for(int k=0;k<n;k++)  
        tmp[i][j]=(tmp[i][j]+ (b[i][k]%mod*a[k][j]%mod) )%mod; 
    for(int i=0;i<n;i++)  
        for(int j=0;j<n;j++)  
        a[i][j]=tmp[i][j];  
}  
LL init[N][N]={
    {2,0,0,0,0,0},
    {1,0,0,0,0,0},
    {27,0,0,0,0,0},
    {9,0,0,0,0,0},
    {3,0,0,0,0,0},
    {1,0,0,0,0,0}
};

LL a[N][N]={
    {1,2,1,0,0,0},
    {1,0,0,0,0,0},
    {0,0,1,3,3,1},
    {0,0,0,1,2,1},
    {0,0,0,0,1,1},
    {0,0,0,0,0,1}
};

LL b[N][N]={
    {1,2,1,0,0,0},
    {1,0,0,0,0,0},
    {0,0,1,3,3,1},
    {0,0,0,1,2,1},
    {0,0,0,0,1,1},
    {0,0,0,0,0,1}
};

LL res[N][N];

void Pow(LL a[][N],LL n)  
{  
    for(int i=0;i<N;i++)
    for(int j=0;j<N;j++) res[i][j]=init[i][j],a[i][j]=b[i][j];
    while(n)  
    {  
        if(n&1)  
            multi(res,a,N);
        multi(a,a,N);  
        n>>=1;  
    }  
}

int main(){
    int q;
    cin>>q;
    while(q--){
        LL n;
        cin>>n;
        Pow(a,n-2);
        cout<<res[0][0]<<endl;
    }
    system("pause");
}
View Code

2:26(2A)

(未完成)[HDUOJ]“字節跳動-文遠知行杯”廣東工業大學第十四屆程序設計競賽