浙江农林大学第十九届程序设计竞赛暨天梯赛选拔赛

A 锯锯锯锯锯锯锯锯锯锯锯锯锯锯

考虑数据范围1e8,所以我们仅记录有用的查询值,而不是记录所有的。

const ll mod = 1e9+7;
const int N= 1e5+7;
ll n,a[N],x[N],y[N],q[N<<1],cnt=0,ans[N<<1];
ll qpow(ll a,ll b){
    ll ans=1;
    while(b){
        if(b&1)ans=ans*a%mod;
        a=a*a%mod;
        b>>=1;
    }
    return ans;
}
int main(){
    scanf("%lld",&n);
    for(int i=1;i<=n;++i){
        scanf("%lld%lld",&x[i],&y[i]);
        if(x[i]>y[i])swap(x[i],y[i]);
        q[++cnt]=x[i];q[++cnt]=y[i];
    }
    sort(q+1,q+1+cnt);
    ll m= unique(q+1,q+1+cnt)-(q+1);
    ll res=1,pos=1;
    for(int i=0;i<=1e8;++i){
        if(i==q[pos])ans[pos]=res,pos++;
        res=(1ll*res*res%mod+res)%mod;
    }
    for(int i=1;i<=n;++i){
        ll aa=ans[lower_bound(q+1,q+1+m,x[i])-q];
        ll bb=ans[lower_bound(q+1,q+1+m,y[i])-q];
        printf("%lld\n",1ll*bb*qpow(aa,mod-2)%mod);
    }
    return 0;
}

 B 每日咕咚

看题意理解一下,每个人在每个位置的贡献。

int n;
double x,v,ans=0.0,a[1007][1007],d;
int main(){
    scanf("%d%lf%lf",&n,&x,&v);
    for(int i=1;i<=n;++i){
        for(int j=1;j<=n;++j){
            scanf("%lf",&d);
            a[i][j]=d-v;
        }
    }
    for(int i=1;i<=n;++i){
        double sum=0.0;
        for(int j=1;j<=n;++j){
            sum=sum+(x*n)/a[i][j];
        }
        ans=ans+sum/n; 
    }
    printf("%.2lf\n",ans);
    return 0;
}

D 涛涛和策策的游戏

分解质因数,得到每个数字贡献的个数,进而化为nim博弈

int main(){
    GetPrime(1e6);
    scanf("%d",&n);
    for(int i=1;i<=n;++i){
        scanf("%d",&a[i]);
    }
    for(int i=1;i<=n;++i){//分解
        if(a[i]==1){
            a[i]=0;
            continue;
        }
        int cntt=0;
        int tmp=a[i];
        if(isPrime[tmp]){
            a[i]=1;
        }
        else{
            for(int j=1;Prime[j]*Prime[j]<=a[i]&&j<=cnt;++j){
                if(tmp%Prime[j]==0){
                    while(tmp%Prime[j]==0)    tmp/=Prime[j],cntt++;
                }
            }
            if(tmp>1)    cntt++;
            a[i]=cntt;
        }
    }
    int ans=a[1];
    for(int i=2;i<=n;++i)
        ans=ans^a[i];
    if(ans==0)  printf("TT txdy!\n");
    else        printf("CC yyds!\n");
    return 0;
}

F 学长的白日梦

乘的时候会爆ll,所以快速乘一下。

ll t,x,i,ans;
ll mul(ll a , ll b , ll mod){
    ll ans = 0 ;
    while(b){
        if(b&1){
            ans = (ans + a) % mod ;
        }
        b >>= 1 ;
        a = (a + a) % mod;
    }
    return ans ;
}
ll qpow(ll x,ll y){
    ll res=1;
    x=x%mod;
    while(y){
        if(y&1)res=mul(res,x,mod);
        x=mul(x,x,mod);
        y>>=1;
    }
    return res%mod;
}
int main(){
    scanf("%d",&t);
    while(t--){
        scanf("%lld%lld",&x,&i);
        ans=qpow(x,i);
        printf("%lld\n",ans);
    }
    return 0;
}

 

posted @ 2020-10-29 23:17  PdrEam  阅读(141)  评论(0编辑  收藏  举报