A. Distinct Digits
#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int mx = 1e5 + 10;
int top;
int a[mx];
bool check(int i){
bool b[20];
memset(b,0,sizeof(b));
while(i){
if (b[i%10]) return 0;
b[i%10] = 1;
i /= 10;
}
return 1;
}
int main()
{
int n,m;
for (int i=1;i<mx;i++){
if (check(i))
a[top++] = i;
}
scanf("%d%d",&n,&m);
int k1 = lower_bound(a,a+top,n) - a;
int k2 = upper_bound(a,a+top,m) - a;
if (k1==k2) puts("-1");
else
printf("%d\n",a[k1]);
return 0;
}
B. Filling the Grid
#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int mx = 1e3 + 10;
const int mod = 1e9 + 7;
int h,w;
int c[mx],r[mx];
ll qpow(ll x,ll y)
{
ll ans = 1;
while(y){
if(y&1) ans = ans*x%mod;
y >>= 1;
x = x*x%mod;
}
return ans;
}
int main()
{
scanf("%d%d",&h,&w);
for (int i=1;i<=h;i++)
scanf("%d",r+i);
for (int i=1;i<=w;i++)
scanf("%d",c+i);
int ans = 0;
for (int i=1;i<=h;i++){
for(int j=1;j<=w;j++){
if (r[i] == j-1 && c[j] >= i)
return 0*puts("0");
if (c[j] == i-1 && r[i] >= j)
return 0*puts("0");
if (j <= r[i]+1) continue;
if (i <= c[j]+1) continue;
ans++;
}
}
printf("%lld\n",qpow(2,ans));
return 0;
}
C. Primes and Multiplication
#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int mx = 1e5 + 20;
const int mod = 1e9 + 7;
int top,b[mx],c[mx];
int pri[mx];
bool vis[mx];
void init()
{
for (int i=2;i<mx;i++){
if (!vis[i])
pri[top++] = i;
for (int j=0;j<top&&pri[j]*i<mx;j++){
vis[pri[j]*i] = 1;
if (i%pri[j]==0)
break;
}
}
}
ll qpow(ll x,ll y)
{
ll ans = 1;
while(y){
if(y&1) ans = ans*x%mod;
y >>= 1;
x = x*x%mod;
}
return ans;
}
int main()
{
init();
int siz = 0;
ll m,n;
scanf("%lld%lld",&n,&m);
for (int i=0;1ll*pri[i]*pri[i]<=n;i++) {
if (n % pri[i] == 0)
b[siz++] = pri[i];
while (n % pri[i] == 0)
n /= pri[i];
}
if (n != 1) b[siz++] = n;
ll ans = 1;
for (int i=0;i<siz;i++){
ll v = 1;
while (v <= m) {
v *= b[i];
if (v > m / b[i]) {
//cout << v << endl;
ans = ans*qpow(v%mod,m/v)%mod;
break;
}
ll cnt = m / v - m / (v*b[i]);
ans = ans*qpow(v%mod,cnt)%mod;
}
}
printf("%lld\n",ans);
return 0;
}
D. Complete Tripartite
#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int mx = 1e5 + 10;
const int mod = 1e9 + 7;
int n,m,ans[mx];
vector <int> g[mx],r[mx];
bool vis[mx];
void dfs(int x)
{
vis[x] = 1;
for (int v:g[x]) if (!vis[v])
dfs(v);
}
int main()
{
scanf("%d%d",&n,&m);
int u,v;
for (int i=0;i<m;i++){
scanf("%d%d",&u,&v);
g[u].push_back(v);
g[v].push_back(u);
}
//dfs(1);
//for (int i=1;i<=n;i++)
// if(!vis[i]) return 0*puts("-1");
int cnt = 0;
for (int i=1;i<=n;i++){
if (!vis[i]) {
bool mark[mx];
memset(mark,0,sizeof(mark));
for (int v:g[i]) mark[v] = 1;
for (int j=1;j<=n;j++) {
if (!mark[j]) {
if (vis[j])
return 0*puts("-1");
vis[j] = 1;
r[cnt].push_back(j);
ans[j] = cnt + 1;
}
}
cnt++;
}
}
if (cnt != 3) return 0*puts("-1");
for (int i=1;i<=n;i++){
for (int v:g[i])
if (ans[i]==ans[v])
return 0*puts("-1");
}
for (int i=0;i<3;i++){
int ret = n - r[i].size();
for (int v:r[i])
if (g[v].size()!=ret)
return 0*puts("-1");
}
for (int i=1;i<=n;i++)
printf("%d ",ans[i]);
return 0;
}
E. Another Filling the Grid
先固定每一列都至少有一个1的方案数,那么接下来就是讨论行的情况,然后根据行来容斥
#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int mx = 1e3 + 10;
const int mod = 1e9 + 7;
int n,m;
ll fac[mx],inv[mx];
void init()
{
inv[0] = fac[0] = inv[1] = 1;
for(int i=1;i<mx;i++) fac[i] = fac[i-1]*i%mod;
for(int i = 2;i<mx;++i) inv[i] = (mod-mod/i)*inv[mod%i] % mod;
for(int i=2;i<mx;i++) inv[i] = inv[i]*inv[i-1]%mod;
}
ll C(int x,int y)
{
return fac[x]*inv[y]%mod*inv[x-y]%mod;
}
ll qpow(ll x,ll y)
{
ll ans = 1;
while (y) {
if (y&1) ans = ans * x%mod;
y >>= 1;
x = x*x%mod;
}
return ans;
}
#define f(x,m) (qpow(m,x)-qpow(m-1,x))
int main()
{
init();
scanf("%d%d",&n,&m);
ll ans = 0;
for (int i=0;i<=n;i++){
ans += ((i&1)? -1 : 1)*C(n,i)*qpow(m-1,n*i)%mod*qpow(f(n-i,m),n)%mod;
ans %= mod;
}
ans += mod;
printf("%lld\n",ans%mod);
return 0;
}
F. One Node is Gone
#include <bits/stdc++.h>
using namespace std;
const int mx = 2e5 + 10;
int n,du[mx];
vector <int> g[mx];
bool flag;
int siz[mx],ma_son[mx];
#define three_son(t1,t2,t3,fa,d) \
min(dfs(t1,fa,d),min(dfs(t2,fa,d+1),dfs(t3,fa,d+1)))
int dfs(int u,int fa,int d)
{
int ans = 1e9;
if (du[u]==1)
return d==n?1e9:-1;
if (du[u]==2||du[u]==4){
if (flag) return -1;
flag = 1;
if (du[u]==2) {
int ret = dfs(g[u][0]==fa?g[u][1]:g[u][0],u,d+1);
return ret == -1?-1:u;
}
if (du[u]==4){
//cout << u << endl;
int tmp[3],top = 0;
for (int v:g[u]) if (v!=fa)
tmp[top++] = v;
int ret = -1;
ret = three_son(tmp[0],tmp[1],tmp[2],u,d+1);
if (ret != -1) return u;
ret = three_son(tmp[1],tmp[0],tmp[2],u,d+1);
if (ret != -1) return u;
ret = three_son(tmp[2],tmp[1],tmp[0],u,d+1);
if (ret != -1) return u;
return -1;
}
}
if (du[u] != 3) return -1;
for (int v:g[u]) {
if (v == fa) continue;
ans = min(ans,dfs(v,u,d+1));
}
return ans;
}
void dfs_siz(int u,int fa)
{
siz[u] = 1;
for (int v:g[u]) {
if (v == fa) continue;
dfs_siz(v,u);
siz[u] += siz[v];
ma_son[u] = max(ma_son[u],siz[v]);
}
ma_son[u] = max(ma_son[u],(1<<n)-2-siz[u]);
}
int main()
{
scanf("%d",&n);
int base = 1<<n;
int u,v;
for (int i=0;i<base-3;i++){
scanf("%d%d",&u,&v);
g[u].push_back(v);
g[v].push_back(u);
du[v]++,du[u]++;
}
dfs_siz(1,-1);
int ret[4],top = 0;
for (int i=1;i<=base-2;i++){
if (ma_son[i]==(1<<(n-1))-1){
//cout << i << endl;
du[i]++;
flag = 0;
int ans = dfs(i,-1,1);
if (ans != -1)
ret[top++] = ans;
du[i]--;
}
}
if (!top) puts("0");
else {
sort(ret,ret+top);
printf("%d\n",top);
for (int i=0;i<top;i++)
printf("%d ",ret[i]);
}
return 0;
}