zoukankan      html  css  js  c++  java
  • 2017 ACM/ICPC Asia Regional Xi'an Online

    A Tree

    unsolved

    B Coin

    分别加减得到的二次项系数做差即可剩余偶数项

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 
     4 typedef long long LL;
     5 const LL mod=1e9+7;
     6 
     7 LL pow_mod(LL a,LL n){
     8     long long res=1,t=a;
     9     while(n){
    10         if(n&1) res=(res*t)%mod;
    11         n/=2;
    12         t=(t*t)%mod;
    13     }
    14     return res;
    15 }
    16 
    17 int main(){
    18     LL t;
    19     scanf("%lld",&t);
    20     while(t--){
    21         LL p,q,k;
    22         scanf("%lld%lld%lld",&p,&q,&k);
    23         LL x=(2*q-p);
    24         x=(x%mod+mod)%mod;
    25         x=(LL)(pow_mod(x,k)*pow_mod(pow_mod(p,k),mod-2))%mod;
    26         if(k%2==0) x++;
    27         else x=1-x;
    28         x=(x%mod+mod)%mod;
    29         x=(LL)x*pow_mod(2,mod-2)%mod;
    30         printf("%lld
    ",x);
    31     }
    32 
    33 
    34     return 0;
    35 }
    Psong

    C Sum

    输出233个10000000

     1 #include <stdio.h>
     2 #include <iostream>
     3 using namespace std;
     4 int main(){
     5     int t;
     6     scanf("%d",&t);
     7     while(t--){
     8         int x;
     9         scanf("%d",&x);
    10         for(int i=1;i<=233;i++){
    11             printf("10000000");
    12         }
    13         printf("
    ");
    14     }
    15 
    16     return 0;
    17 }
    Psong

    D Brain-baffling Game

    unsolved

    E Maximum Flow

    每个数的贡献为min(x,x ^(n-1)),暴力找0和1出现的规律。

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 
     4 typedef long long LL;
     5 const LL mod=1e9+7;
     6 
     7 LL ans1,ans2;
     8 
     9 LL fun(LL x){
    10     LL cnt=0;
    11     while(x){
    12         x/=2;
    13         cnt++;
    14     }
    15     return cnt-1;
    16 }
    17 
    18 LL p[65];
    19 
    20 int main(){
    21     p[0]=1;
    22     for(LL i=1;i<65;i++) p[i]=p[i-1]*2%mod;
    23     LL n;
    24     while(scanf("%lld",&n)!=EOF){
    25         n--;
    26         LL tttt=n;
    27         ans1=ans2=0;
    28         LL cnt=fun(n);
    29         LL tmp=(1LL<<cnt)-1;
    30         tmp%=mod;
    31         ans1=(tmp*(tmp+1)/2)%mod;
    32 
    33         n=n^(1LL<<cnt);
    34         LL res=0;
    35         for(LL i=0;i<=cnt;i++){
    36             LL num=0;
    37             res+=p[i]*((n&(1LL<<i))?1:0);
    38             res%=mod;
    39             num+=(n>>(i+1))*p[i]%mod;
    40             if(n&(1LL<<i)) num+=res-p[i]+1;
    41             if(n&(1LL<<i)) ans2+=((n-num+1)%mod+mod)*p[i]%mod;
    42             else ans2+=(num%mod)*p[i]%mod;
    43             ans2%=mod;
    44         }
    45         LL ans=(ans1+ans2+tttt)%mod;
    46         printf("%lld
    ",ans);
    47     }
    48 
    49     return 0;
    50 }
    Psong

    F Trig Function

    好像有公式。

    G Xor

    Big-Small

    1.对于小数据,预处理出每个点向上跳,跳到根,步伐为k的结果。

    2.对于大数据,两个端点都倍增得向上跳到lca。

      1 #include <bits/stdc++.h>
      2 using namespace std;
      3 
      4 const int MAX_V=5e4+5;
      5 const int MAX_LOG=18;
      6 int S;
      7 
      8 int n,q;
      9 int a[MAX_V];
     10 
     11 vector<int> g[MAX_V];
     12 int fa[MAX_LOG][MAX_V];
     13 int depth[MAX_V];
     14 void addedge(int u,int v){
     15     g[u].push_back(v);
     16     g[v].push_back(u);
     17 }
     18 void dfs(int u,int pre,int d){
     19     fa[0][u]=pre;
     20     depth[u]=d;
     21     for(int i=0;i<g[u].size();i++){
     22         int v=g[u][i];
     23         if(v==pre) continue;
     24         dfs(v,u,d+1);
     25     }
     26 }
     27 void init(int n){
     28     depth[0]=0;
     29     dfs(1,0,1);
     30     for(int k=0;k+1<MAX_LOG;k++){
     31         fa[k+1][0]=fa[k][0]=0;
     32         for(int v=1;v<=n;v++){
     33             fa[k+1][v]=fa[k][fa[k][v]];
     34         }
     35     }
     36 }
     37 int LCA(int u,int v){
     38     if(depth[u]>depth[v]) swap(u,v);
     39     for(int k=MAX_LOG-1;k>=0;k--){
     40         if((depth[v]-depth[u])&(1<<k)){
     41             v=fa[k][v];
     42         }
     43     }
     44     if(u==v) return u;
     45     for(int k=MAX_LOG-1;k>=0;k--){
     46         if(fa[k][u]!=fa[k][v]){
     47             u=fa[k][u];
     48             v=fa[k][v];
     49         }
     50     }
     51     return fa[0][v];
     52 }
     53 
     54 int id[MAX_V];
     55 int dp[MAX_V][605];
     56 int par[MAX_V][605];
     57 void dfs2(int u,int d){
     58     id[d]=u;
     59     par[u][0]=u;
     60     for(int i=1;i<=S;i++){
     61         dp[0][i]=0;
     62         if(d<=i){
     63             dp[u][i]=a[u];
     64             par[u][i]=0;
     65         }
     66         else {
     67             dp[u][i]=a[u]^dp[id[d-i]][i];
     68             par[u][i]=id[d-i];
     69         }
     70     }
     71     for(int i=0;i<g[u].size();i++){
     72         int v=g[u][i];
     73         if(v==fa[0][u]) continue;
     74         dfs2(v,d+1);
     75     }
     76 }
     77 
     78 int pre(int u,int k){
     79     int res=u;
     80     for(int i=MAX_LOG-1;i>=0;i--){
     81         if(k&(1<<i)) res=fa[i][res];
     82     }
     83     return res;
     84 }
     85 
     86 int solve1(int u,int v,int k){
     87     int lca=LCA(u,v);
     88     int res=(depth[v]+depth[u]-2*depth[lca])%k;
     89     int s=u,t=pre(v,res);
     90     int ans=0;
     91     if((depth[u]-depth[lca])%k==0) ans=a[lca];
     92     while(depth[s]>depth[lca]){
     93         ans^=a[s];
     94         s=pre(s,k);
     95     }
     96     while(depth[t]>depth[lca]){
     97         ans^=a[t];
     98         t=pre(t,k);
     99     }
    100     return ans;
    101 }
    102 int solve2(int u,int v,int k){
    103     int lca=LCA(u,v);
    104     int res1=(k-((depth[u]-depth[lca])%k))%k;
    105     int s1=u,s2=par[lca][res1];
    106 
    107     int ans=dp[s1][k]^dp[s2][k];
    108     if((depth[u]-depth[lca])%k==0) ans^=a[lca];
    109 
    110     int res2=(depth[v]+depth[u]-2*depth[lca])%k;
    111     int t1=par[v][res2];
    112     if(lca!=v&&depth[t1]>depth[lca]){
    113         int res3=(k-((depth[t1]-depth[lca])%k))%k;
    114         int t2=par[lca][res3];
    115         ans^=(dp[t1][k]^dp[t2][k]);
    116     }
    117 
    118     return ans;
    119 }
    120 
    121 int main(){
    122     while(~scanf("%d%d",&n,&q)){
    123         S=min(600,(int)sqrt(q*(log(1.0*n)/log(2.0))));
    124         for(int i=1;i<=n;i++){
    125             g[i].clear();
    126         }
    127         for(int i=1;i<n;i++){
    128             int u,v;
    129             scanf("%d%d",&u,&v);
    130             addedge(u,v);
    131         }
    132         for(int i=1;i<=n;i++){
    133             scanf("%d",&a[i]);
    134         }
    135         init(n); dfs2(1,1);
    136         while(q--){
    137             int u,v,k;
    138             scanf("%d%d%d",&u,&v,&k);
    139             if(k>S) printf("%d
    ",solve1(u,v,k));
    140             else printf("%d
    ",solve2(u,v,k));
    141         }
    142     }
    143 
    144     return 0;
    145 }
    Psong

    H Music

    unsolved

    I Barty's Computer

    unsolved

    J Easy Problem

    unsolved

  • 相关阅读:
    HDU-3336-Count the string(扩展KMP)
    洛谷-P3805-Manacher模板
    洛谷-p5410-扩展KMP模板
    HDU-2594-Simpsons' Hidden Talents(kmp, 扩展kmp)
    POJ-3080-Blue jeans(KMP, 暴力)
    [办公应用]两个单独的列数据快速变为两列匹配关联数据
    [办公应用]如何将单词中的部分字母加下划线
    [办公应用]word 2007:全屏快捷键,让复制图片保持原样大小(office 全屏快捷键)
    [办公自动化]如何让excel图表标签中显示最新值数据
    [计算机故障处理]无法访问网络共享资源
  • 原文地址:https://www.cnblogs.com/N-Psong/p/7602880.html
Copyright © 2011-2022 走看看