• 题解Codeforces Round #596 (Div. 2, based on Technocup 2020 Elimination Round 2) (CF1247)


    A:注意9和1的特判。

     1 #include<stdio.h>
     2 #define it register int
     3 #define il inline
     4 int a,b;
     5 int main(){ 
     6     scanf("%d%d",&a,&b);
     7     if(a^b){
     8         if(a+1==b) return printf("%d %d",a,b),0;
     9         if(a==9&&b==1) return printf("%d9 %d00",a,b),0;
    10         printf("-1"); 
    11         return 0;
    12     }
    13     if(a==0&&b==0) return puts("-1"),0;
    14     printf("%d1 %d2",a,b);
    15     return 0;
    16 }
    View Code 

    B:线性扫描,控制长度为d即可.

     1 #include<stdio.h>
     2 #define it register int
     3 #define il inline
     4 #define Min(a,b) (a<b?a:b)
     5 const int N=1000005;
     6 int T,n,d,a[N],k,cn[N],ans;
     7 il void fr(int &num){
     8     num=0;char c=getchar();int p=1;
     9     while(c<'0'||c>'9') c=='-'?p=-1,c=getchar():c=getchar();
    10     while(c>='0'&&c<='9') num=num*10+c-'0',c=getchar();
    11     num*=p;
    12 }   
    13 int main(){ 
    14     fr(T);
    15     while(T--){
    16         fr(n),fr(k),fr(d),ans=0;
    17         for(it i=1;i<=n;++i) fr(a[i]);
    18         for(it i=1;i<=d;++i) ans+=(!cn[a[i]]),++cn[a[i]];
    19         for(it i=1,now=ans;i+d<=n;++i){
    20             if(!--cn[a[i]]) --now;
    21             if(!cn[a[i+d]]++) ++now;
    22             ans=Min(ans,now);
    23         }
    24         if(n<k) for(it i=1;i<=n;++i) cn[a[i]]=0;
    25         else for(it i=0;i<=k;++i) cn[i]=0;
    26         printf("%d
    ",ans);
    27     }
    28     return 0;
    29 }
    View Code

    C:移项,枚举n-p*d,检查是否可行即可。由于可以有重复的,记录一下最多和最少分解的个数,只要minn<=d<=maxn就是可行解。

     1 #include<stdio.h>
     2 #define it register int
     3 #define il inline
     4 const int N=100005;
     5 typedef long long ll;
     6 ll pw[N],n,p;
     7 bool ck(ll x,it d){ 
     8     it now=0;
     9     ll now2=0;
    10     for(it i=62;i>=0;--i) if(x>=pw[i]) x-=pw[i],++now,now2+=pw[i];
    11     return now<=d&&now2>=d;
    12 }
    13 int main(){ 
    14     pw[0]=1ll;for(it i=1;i<=62;++i) pw[i]=pw[i-1]<<1ll;
    15     scanf("%lld%lld",&n,&p);
    16     for(it i=1;n>p*i&&i<=10000;++i)
    17         if(ck(n-p*i,i)) return printf("%d",i),0;
    18     puts("-1");
    19     return 0;
    20 }
    View Code

    D:考虑n=a1p1*a2p2*……*anpn 。那么我们只要求出n=a1(k-p1)*a2(k-p2)*……*an(k-pn) *x1*x2k *……*xnk是否存在就可以了。先把前面的算出来,hash一下。

     1 #include<stdio.h>
     2 #include<vector>
     3 #include<map>
     4 #include<algorithm>
     5 #define it register int
     6 #define il inline
     7 #define Max(a,b) (a<b?a:b)
     8 using namespace std;
     9 typedef long long ll;
    10 const int N=100002;
    11 int a[N],p[N],minp[N],pri[N],cnt,k,n,pos;
    12 bool pr[N]; 
    13 vector<pair<int,int> > g[N],vec;
    14 map<vector<pair<int,int> > ,ll> mp;
    15 ll ans;
    16 il void prime(){
    17     register ll x;minp[1]=1;
    18     for(int i=2;i<=N;i++){
    19         if(!pr[i]) pri[++cnt]=i,minp[i]=i;
    20         for(int j=1;(x=1ll*i*pri[j])<=N&&j<=cnt;j++){
    21             pr[x]=true,minp[x]=Max(minp[i],pri[j]);
    22             if(i%pri[j]==0) break;
    23         }
    24     }
    25 }
    26 namespace io {
    27     const int SIZE = (1 << 21) + 1;
    28     char ibuf[SIZE], *iS, *iT, obuf[SIZE], *oS = obuf, *oT = oS + SIZE - 1, c, qu[55];
    29     int f, qr;
    30 #define gc() (iS == iT ? (iT = (iS = ibuf) + fread (ibuf, 1, SIZE, stdin), (iS == iT ? EOF : *iS ++)) : *iS ++)
    31     inline void flush () {fwrite (obuf, 1, oS - obuf, stdout);oS = obuf;}
    32     template <class I>
    33     inline void fr (I &x) {
    34         for (f = 1, c = gc(); c < '0' || c > '9'; c = gc()) if (c == '-') f = -1;
    35         for (x = 0; c <= '9' && c >= '0'; c = gc()) x = x * 10 + (c & 15);
    36         x *= f;
    37     }
    38     struct Flusher_ {~Flusher_() {flush();}} io_flusher_;
    39 }
    40 using io :: fr;  
    41 il void fj(it x){
    42     while(x>1){
    43         it minn=minp[x],cnum=0;
    44         while(minp[x]==minn&&x>1) x/=minp[x],++cnum;
    45         if(cnum%k) g[pos].push_back(make_pair(minn,cnum%k)); 
    46     }
    47     std::sort(g[pos].begin(),g[pos].end());
    48 }
    49 int main(){ 
    50     fr(n),fr(k);prime(); 
    51     for(it i=1;i<=n;++i) fr(a[i]),pos=i,fj(a[i]);
    52     for(it i=1;i<=n;++i){
    53         vec.clear();
    54         for(it j=0,sz=g[i].size();j<sz;++j)
    55             vec.push_back(make_pair(g[i][j].first,(k-g[i][j].second)%k));
    56         ans+=mp[vec],++mp[g[i]];
    57     }
    58     printf("%I64d",ans);
    59     return 0;
    60 }  
    View Code

    E:暂时不会先咕着,等水平提升了补上

    F:同E。

    这次打的不好QAQ……下次继续努力啊!

  • 相关阅读:
    [蓝桥杯][算法提高VIP]传染病控制
    PAT甲级第二次真题练习
    BFS()搜索加上hash
    PAT甲级第一次真题练习
    一个小练习题
    八皇后
    【Noi 1994 删数问题】【openjudge 3528 最小新整数(变式)】整型与字符
    【openjudge 2469 电池的寿命】算法与思维
    MarkDown测试
    HNOI 2017 怼大佬
  • 原文地址:https://www.cnblogs.com/Kylin-xy/p/11746663.html
Copyright © 2020-2023  润新知