您的位置:首页 > 其它

BestCoder Round #93 ABC

2017-04-04 19:05 369 查看
A:

题目大意:

将数组划分成最少的段,每段的数两两不同。

题解:直接用一个map记录一个数是否出现过,贪心的每次取最多个数就好。

B:

题目大意:

给出一个0-9组成的字符串,问能否删掉K个数字,使得最后形成的数没有前导零且能被3整除。

题解:

最后会留下N-K个数,枚举第一个数的位置,然后问题就可以转化为判断同余方程0*x+1*y+2*z = v (mod 3) 是否有解。 其中(x+y+z=K-1 && x<=a && y<=b && z<=c)

设:

x = i (mod 3)

y = j (mod 3)

z = k (mod 3)

在[0,2]范围里枚举i,j,k

然后可行的条件是:

1. i<=a , j <=b , k <=c

2. 0*i+1*j+2*k = v (mod 3)

3. i+j+k <= K-1

4. 3*( (a-i)/3+(b-j)/3+(c-k)/3 )+ i+ j + k >= K-1

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <cmath>
#include <queue>
using namespace std;

#define X first
#define Y second
#define N 100010
#define M 11

typedef long long ll;
const int Mod=1000000007;
const int INF=1<<30;

char s[26];
int cnt[27],a[10],b[10];
int pw[27];
bool vis[26];

int Lcm(int x,int y)
{
int lcm=x*y,tmp;
while (y)
{
tmp=x%y;
x=y,y=tmp;
}

return lcm/x;
}

int Power(int x,int P)
{
if (pw[x]) return pw[x];
int res=1,xx=x;
for (;P;P>>=1)
{
if (P&1) res=1ll*res*x%Mod;
x=1ll*x*x%Mod;
}
return pw[xx]=res;
}

int Solve(int len,int n)
{
//for (int i=0;i<n;i++) cout<<i<<" "<<a[i]<<" "<<b[i]<<endl;
int lim=1<<n,val,cnt,m,t,res=0;
for (int mask1=1;mask1<lim;mask1++)
{
val=1; t=0;
for (int i=0;i<n;i++) if (mask1&(1<<i)) val=Lcm(val,a[i]),t+=b[i];
cnt=Power(t,len);
for (int mask2=(mask1-1)&mask1;mask2;mask2=(mask2-1)&mask1)
{
int op=1; m=t;
for (int j=0;j<n;j++) if (mask2&(1<<j)) op=-op,m-=b[j];
cnt+=op*Power(m,len); cnt%=Mod;
}

res+=1ll*cnt*val%Mod; res%=Mod;
}
return res<0? res+Mod:res;
}

int main()
{
//freopen("in.in","r",stdin);
//freopen("out.out","w",stdout);

int T,len; scanf("%d",&T);
while (T--)
{
scanf("%d%s",&len,s);
memset(vis,0,sizeof(vis));
memset(cnt,0,sizeof(cnt));
memset(pw,0,sizeof(pw));
for (int i=0;i<26;i++)
{
if (!vis[i])
{
int c=0,x=i;
do
{
c++;
x=s[x]-'a';
vis[x]=true;
}while (x!=i);
cnt[c]+=c;
}
}
int n=0;
for (int i=1;i<=26;i++) if (cnt[i]) a
=i,b[n++]=cnt[i];
printf("%d\n",Solve(len,n));
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: