题解:2015 ACM-ICPC Asia Dhaka Regional Contest

34 篇文章 0 订阅

Automatic Cheater Detection

没注意到难度取值范围小于十,于是写了个二分跑过去了,还挺快的。

#include<bits/stdc++.h>
using namespace std;
char r[9];
int t,q;
int main()
{
    for(scanf("%d",&t); t--;)
    {
        scanf("%d",&q);
        vector<int> dui,cuo;
        long long ans=0;
        for(int i=0,s,d; i<q; ++i)
        {
            scanf("%d%d%s",&d,&s,r);
            if(s&&r[0]=='c')dui.push_back(d);
            if(!s&&r[0]=='i')cuo.push_back(d);
        }
        sort(dui.begin(),dui.end());
        sort(cuo.begin(),cuo.end());
        for(int i=0; i<dui.size(); ++i)
            ans+=lower_bound(cuo.begin(),cuo.end(),dui[i])-cuo.begin();
        printf("%lld\n",ans);
    }
}

Counting Weekend Days

#include<bits/stdc++.h>
using namespace std;
int mo(const string &s)
{
    return s=="FEB"?28:
           s=="APR"||s=="JUN"||s=="SEP"||s=="NOV"?30:31;
}
int da(const string &s)
{
    return s=="SUN"?0:
           s=="MON"?1:
           s=="TUE"?2:
           s=="WED"?3:
           s=="THU"?4:
           s=="FRI"?5:6;
}
int main()
{
    int t,ans;
    string mth,day;
    for(cin>>t; t--; cout<<ans<<'\n')
    {
        cin>>mth>>day;
        for(int i=ans=0,m=mo(mth),d=da(day); i<m; ++i,++d)
            if(d%7>4)++ans;
    }
}

Owllen

#include<bits/stdc++.h>
using namespace std;
char s[100009];
int t,kase,cnt[26];
int main()
{
    for(scanf("%d",&t); t--;)
    {
        fill(cnt,cnt+26,0);
        scanf("%s",s);
        for(int i=0; s[i]; ++i)++cnt[s[i]-'a'];
        printf("Case %d: %d\n",++kase,*min_element(cnt,cnt+26));
    }
}

Sum of MSLCM

#include<bits/stdc++.h>
#define at operator[]
using namespace std;
const int N=2e7+7;
struct EulerSieve
{
    vector<int> p,m;
    EulerSieve(int N):m(N,0)
    {
        for(long long i=2,k; i<N; ++i)
        {
            if(!m[i])p.push_back(m[i]=i);
            for(int j=0; j<p.size()&&(k=i*p[j])<N; ++j)
                if((m[k]=p[j])==m[i])break;
        }
    }
} e(N);
typedef long long ll;
struct Solve:vector<ll>
{
    Solve(int N):vector<ll>(N,0)
    {
        for(int i=2; i<N; ++i)at(i)=at(i-1)+cal(i);
    }
    ll cal(int x)
    {
        if(x==1)return 1;
        if(at(x))return at(x)-at(x-1);
        int t=e.m[x];
        x/=t;
        if(x%t==0)return cal(x)*(t+1)-cal(x/t)*t;
        return cal(x)*(t+1);
    }
} s(N);
int main()
{
    for(int n; scanf("%d",&n),n;)printf("%lld\n",s[n]);
}

Design New Capital

写的ntt奇慢无比…

#include<bits/stdc++.h>
#define mul(a,b,c) (1LL*(a)*(b)%(c))
#define inv(a,b) pow(a,(b)-2,b)
using namespace std;
typedef int ll;
const ll N=1e5+7,M=7340033,G=3;
ll pow(ll a,ll b,ll m)
{
    ll r=1;
    for(; b; b>>=1,a=mul(a,a,m))
        if(b&1)r=mul(r,a,m);
    return r;
}
struct Factorial
{
    vector<ll> fac,ifac;
    ll M;
    Factorial(int N,ll M):fac(N,1),ifac(N,1),M(M)
    {
        for(int i=1; i<N; ++i)fac[i]=mul(fac[i-1],i,M);
        ifac[N-1]=inv(fac[N-1],M);
        for(int i=N-1; i; --i)ifac[i-1]=mul(ifac[i],i,M);
    }
    ll c(int n,int m)
    {
        return m>n?0:mul(mul(fac[n],ifac[m],M),ifac[n-m],M);
    }
} f(N,M);
template<typename T>
void rader(vector<T> &x)
{
    for(int i=0,j=0,k; i<x.size()-1; ++i,j+=k)
    {
        if(i<j)swap(x[i],x[j]);
        for(k=x.size()>>1; k<=j; k>>=1)j-=k;
    }
}
void fntt(vector<ll> &x,ll inv,ll m,ll g)
{
    rader(x);
    if(inv!=1)inv=m-2;
    for(int i=1,j; i<x.size(); i<<=1)
        for(ll u=pow(g,mul(m/2/i,inv,m-1),m),w=1,t=j=0;
                j<i; ++j,w=mul(w,u,m))
            for(int k=j; k<x.size(); k+=i<<1)
            {
                t=mul(w,x[k+i],m);
                if(x[k+i]=x[k]-t,x[k+i]<0)x[k+i]+=m;
                if(x[k]+=t,x[k]>=m)x[k]-=m;
            }
    if(inv==1)return;
    ll u=pow(x.size(),m-2,m);
    for(int i=0; i<x.size(); ++i)x[i]=mul(x[i],u,m);
}
int t,n,kase;
int main()
{
    for(scanf("%d",&t); t--;)
    {
        int cnt[4]= {0,0,0,0},len=1;
        for(scanf("%d",&n); len<n*2;)len*=2;
        vector<ll> a(len),b(len);
        for(int i=0,x,y; i<n; ++i)
        {
            scanf("%d%d",&x,&y);
            if(x>0&&y<0)++cnt[0];
            if(x>0&&y>0)++cnt[1];
            if(x<0&&y>0)++cnt[2];
            if(x<0&&y<0)++cnt[3];
        }
        for(int i=0; i<=n; ++i)
            a[i]=mul(f.c(cnt[0],i),f.c(cnt[2],i),M),b[i]=mul(f.c(cnt[1],i),f.c(cnt[3],i),M);
        fntt(a,1,M,G),fntt(b,1,M,G);
        for(int i=0; i<a.size(); ++i)a[i]=mul(a[i],b[i],M);
        fntt(a,-1,M,G);
        printf("Case %d:\n",++kase);
        for(int i=1; i<=n; ++i)
            printf("%lld%c",i%2?0:a[i/2],i==n?'\n':' ');
    }
}

Numbered Cards

#include<bits/stdc++.h>
#define mul(a,b,c) (1LL*(a)*(b)%(c))
using namespace std;
const int N=1e9+7,M=1e9+7;
long long t,n,casenum,f[11][1<<11],u[11][1<<11],g[1<<11],h[1<<11];
long long ans[1<<11][1<<11];
int main()
{
    f[0][0]=1;
    for (int i=1; i<10; ++i)f[1][1<<i]=1;
    for(int i=1; i<10; ++i)
        for(int j=1<<10; j--;)
            for(int k=1<<9; k; k>>=1)
                f[i+1][j|k]=(f[i+1][j|k]+f[i][j])%M;
    u[0][0]=1;
    for(int i=0; i<10; ++i)
        for(int j=1<<10; j--;)
            for(int k=1<<9; k; k>>=1)
                u[i+1][j|k]=(u[i+1][j|k]+u[i][j])%M;
//  for (int i=1;i<1<<6;i++) printf("%d ",f[2][i]);
    for(scanf("%lld",&t); t--;)
    {
        fill(g,g+(1<<10),0);
        vector<int> v;
        scanf("%lld",&n);
        for(int j=n+1; j; j/=10)v.push_back(j%10);
        for(int i=1; i<v.size(); ++i)
            for(int j=1<<10; j--;)
                g[j]=(g[j]+f[i][j])%M;
        for(int i=v.size()-1,now=0; ~i; --i)
        {
            for(int j=i==v.size()-1?1:0; j<v[i]; ++j)
             for(int k=1<<10; k--;) g[k|now|1<<j]=(g[k|now|1<<j]+u[i][k])%M;
            now|=1<<v[i];
        }
        /*
        for(int i=1;i<(1<<10);i++)
            if (g[i]) printf("%d %d\n",i,g[i]);
        */
        memset(ans,0,sizeof(ans));
        ans[0][0]=1;
        for(int i=0;i<(1<<10)-1;i++)
            for(int j=0;j<1<<10;j++)
            {
                ans[i+1][j]=(ans[i+1][j]+ans[i][j])%M;
                if (((i+1)&j)==0) ans[i+1][(i+1)|j]=(ans[i+1][(i+1)|j]+(ans[i][j]*g[i+1])%M)%M;
            }
        long long val=0;
        for (int i=0;i<1<<10;i++) val=(val+ans[(1<<10)-1][i])%M;
        val=(val+M-1)%M;
        printf("Case %lld: %lld\n",++casenum,val);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值