A. ASCII Addition

模拟

#include <iostream>
#include <sstream>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <set>
#include <map>
#include <queue>
#include <string>
#include <cstring>
#include <bitset>
#include <functional>
#include <random>
#define REP(_i,_a,_n) for(int _i=_a;_i<=_n;++_i)
#define PER(_i,_a,_n) for(int _i=_n;_i>=_a;--_i)
#define hr putchar(10)
#define pb push_back
#define lc (o<<1)
#define rc (lc|1)
#define mid ((l+r)>>1)
#define ls lc,l,mid
#define rs rc,mid+1,r
#define x first
#define y second
#define io std::ios::sync_with_stdio(false)
#define endl '\n'
#define DB(_a) ({REP(_i,1,n) cout<<_a[_i]<<',';hr;})
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int P = 1e9+, INF = 0x3f3f3f3f;
ll gcd(ll a,ll b) {return b?gcd(b,a%b):a;}
ll qpow(ll a,ll n) {ll r=%P;for (a%=P;n;a=a*a%P,n>>=)if(n&)r=r*a%P;return r;}
ll inv(ll x){return x<=?:inv(P%x)*(P-P/x)%P;}
inline int rd() {int x=;char p=getchar();while(p<''||p>'')p=getchar();while(p>=''&&p<='')x=x*+p-'',p=getchar();return x;}
//head const int N = 1e6+;
char s[][N],ans[][N]; int id(int i) {
if (string(s[]+i,s[]+i+)=="....x") {
if (string(s[]+i,s[]+i+)=="....x")
if (string(s[]+i,s[]+i+)=="....x")
if (string(s[]+i,s[]+i+)=="....x")
if (string(s[]+i,s[]+i+)=="....x")
if (string(s[]+i,s[]+i+)=="....x")
if (string(s[]+i,s[]+i+)=="....x")
return ;
}
if (string(s[]+i,s[]+i+)=="xxxxx") {
if (string(s[]+i,s[]+i+)=="....x")
if (string(s[]+i,s[]+i+)=="....x")
if (string(s[]+i,s[]+i+)=="xxxxx")
if (string(s[]+i,s[]+i+)=="x....")
if (string(s[]+i,s[]+i+)=="x....")
if (string(s[]+i,s[]+i+)=="xxxxx")
return ;
}
if (string(s[]+i,s[]+i+)=="xxxxx") {
if (string(s[]+i,s[]+i+)=="....x")
if (string(s[]+i,s[]+i+)=="....x")
if (string(s[]+i,s[]+i+)=="xxxxx")
if (string(s[]+i,s[]+i+)=="....x")
if (string(s[]+i,s[]+i+)=="....x")
if (string(s[]+i,s[]+i+)=="xxxxx")
return ;
}
if (string(s[]+i,s[]+i+)=="x...x") {
if (string(s[]+i,s[]+i+)=="x...x")
if (string(s[]+i,s[]+i+)=="x...x")
if (string(s[]+i,s[]+i+)=="xxxxx")
if (string(s[]+i,s[]+i+)=="....x")
if (string(s[]+i,s[]+i+)=="....x")
if (string(s[]+i,s[]+i+)=="....x")
return ;
}
if (string(s[]+i,s[]+i+)=="xxxxx") {
if (string(s[]+i,s[]+i+)=="x....")
if (string(s[]+i,s[]+i+)=="x....")
if (string(s[]+i,s[]+i+)=="xxxxx")
if (string(s[]+i,s[]+i+)=="....x")
if (string(s[]+i,s[]+i+)=="....x")
if (string(s[]+i,s[]+i+)=="xxxxx")
return ;
}
if (string(s[]+i,s[]+i+)=="xxxxx") {
if (string(s[]+i,s[]+i+)=="x....")
if (string(s[]+i,s[]+i+)=="x....")
if (string(s[]+i,s[]+i+)=="xxxxx")
if (string(s[]+i,s[]+i+)=="x...x")
if (string(s[]+i,s[]+i+)=="x...x")
if (string(s[]+i,s[]+i+)=="xxxxx")
return ;
}
if (string(s[]+i,s[]+i+)=="xxxxx") {
if (string(s[]+i,s[]+i+)=="....x")
if (string(s[]+i,s[]+i+)=="....x")
if (string(s[]+i,s[]+i+)=="....x")
if (string(s[]+i,s[]+i+)=="....x")
if (string(s[]+i,s[]+i+)=="....x")
if (string(s[]+i,s[]+i+)=="....x")
return ;
}
if (string(s[]+i,s[]+i+)=="xxxxx") {
if (string(s[]+i,s[]+i+)=="x...x")
if (string(s[]+i,s[]+i+)=="x...x")
if (string(s[]+i,s[]+i+)=="xxxxx")
if (string(s[]+i,s[]+i+)=="x...x")
if (string(s[]+i,s[]+i+)=="x...x")
if (string(s[]+i,s[]+i+)=="xxxxx")
return ;
}
if (string(s[]+i,s[]+i+)=="xxxxx") {
if (string(s[]+i,s[]+i+)=="x...x")
if (string(s[]+i,s[]+i+)=="x...x")
if (string(s[]+i,s[]+i+)=="xxxxx")
if (string(s[]+i,s[]+i+)=="....x")
if (string(s[]+i,s[]+i+)=="....x")
if (string(s[]+i,s[]+i+)=="xxxxx")
return ;
}
if (string(s[]+i,s[]+i+)=="xxxxx") {
if (string(s[]+i,s[]+i+)=="x...x")
if (string(s[]+i,s[]+i+)=="x...x")
if (string(s[]+i,s[]+i+)=="x...x")
if (string(s[]+i,s[]+i+)=="x...x")
if (string(s[]+i,s[]+i+)=="x...x")
if (string(s[]+i,s[]+i+)=="xxxxx")
return ;
}
return -;
} void add(int x, int y, string s) {
ans[x][y]=s[],ans[x][y+]=s[],ans[x][y+]=s[],ans[x][y+]=s[],ans[x][y+]=s[];
}
int tot;
void pr(int x) {
++tot;
if (x==) {
add(,tot,"....x");
add(,tot,"....x");
add(,tot,"....x");
add(,tot,"....x");
add(,tot,"....x");
add(,tot,"....x");
add(,tot,"....x");
}
if (x==) {
add(,tot,"xxxxx");
add(,tot,"....x");
add(,tot,"....x");
add(,tot,"xxxxx");
add(,tot,"x....");
add(,tot,"x....");
add(,tot,"xxxxx");
}
if (x==) {
add(,tot,"xxxxx");
add(,tot,"....x");
add(,tot,"....x");
add(,tot,"xxxxx");
add(,tot,"....x");
add(,tot,"....x");
add(,tot,"xxxxx");
}
if (x==) {
add(,tot,"x...x");
add(,tot,"x...x");
add(,tot,"x...x");
add(,tot,"xxxxx");
add(,tot,"....x");
add(,tot,"....x");
add(,tot,"....x");
}
if (x==) {
add(,tot,"xxxxx");
add(,tot,"x....");
add(,tot,"x....");
add(,tot,"xxxxx");
add(,tot,"....x");
add(,tot,"....x");
add(,tot,"xxxxx");
}
if (x==) {
add(,tot,"xxxxx");
add(,tot,"x....");
add(,tot,"x....");
add(,tot,"xxxxx");
add(,tot,"x...x");
add(,tot,"x...x");
add(,tot,"xxxxx");
}
if (x==) {
add(,tot,"xxxxx");
add(,tot,"....x");
add(,tot,"....x");
add(,tot,"....x");
add(,tot,"....x");
add(,tot,"....x");
add(,tot,"....x");
}
if (x==) {
add(,tot,"xxxxx");
add(,tot,"x...x");
add(,tot,"x...x");
add(,tot,"xxxxx");
add(,tot,"x...x");
add(,tot,"x...x");
add(,tot,"xxxxx");
}
if (x==) {
add(,tot,"xxxxx");
add(,tot,"x...x");
add(,tot,"x...x");
add(,tot,"xxxxx");
add(,tot,"....x");
add(,tot,"....x");
add(,tot,"xxxxx");
}
if (x==) {
add(,tot,"xxxxx");
add(,tot,"x...x");
add(,tot,"x...x");
add(,tot,"x...x");
add(,tot,"x...x");
add(,tot,"x...x");
add(,tot,"xxxxx");
}
tot += ;
} int a[N],cnt;
int main() {
REP(i,,) scanf("%s",s[i]+);
int len = strlen(s[]+);
REP(i,,len) {
a[++cnt] = id(i);
i += ;
}
ll L = , R = ;
REP(i,,cnt) {
if (a[i]==-) {
REP(j,i+,cnt) R = R*+a[j];
break;
}
L = L*+a[i];
}
L += R;
int s[],cnt=;
while (L) s[++cnt]=L%,L/=;
PER(i,,cnt) {
pr(s[i]);
if (i!=) {
++tot;
ans[][tot]='.';
ans[][tot]='.';
ans[][tot]='.';
ans[][tot]='.';
ans[][tot]='.';
ans[][tot]='.';
ans[][tot]='.';
}
}
REP(i,,) puts(ans[i]+);
}

B. Book Borders

直接二分模拟就能过

#include <iostream>
#include <sstream>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <set>
#include <map>
#include <queue>
#include <string>
#include <cstring>
#include <bitset>
#include <functional>
#include <random>
#define REP(_i,_a,_n) for(int _i=_a;_i<=_n;++_i)
#define PER(_i,_a,_n) for(int _i=_n;_i>=_a;--_i)
#define hr putchar(10)
#define pb push_back
#define lc (o<<1)
#define rc (lc|1)
#define mid ((l+r)>>1)
#define ls lc,l,mid
#define rs rc,mid+1,r
#define x first
#define y second
#define io std::ios::sync_with_stdio(false)
#define endl '\n'
#define DB(_a) ({REP(_i,1,n) cout<<_a[_i]<<',';hr;})
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int P = 1e9+, INF = 0x3f3f3f3f;
ll gcd(ll a,ll b) {return b?gcd(b,a%b):a;}
ll qpow(ll a,ll n) {ll r=%P;for (a%=P;n;a=a*a%P,n>>=)if(n&)r=r*a%P;return r;}
ll inv(ll x){return x<=?:inv(P%x)*(P-P/x)%P;}
inline int rd() {int x=;char p=getchar();while(p<''||p>'')p=getchar();while(p>=''&&p<='')x=x*+p-'',p=getchar();return x;}
//head const int N = 1e6+;
int n,a,b,sum[N];
string s[N],t; int len(int i, int j) {
return sum[j]-sum[i-]+j-i;
} int main() {
getline(cin,t);
stringstream ss(t);
while (ss>>t) s[++n]=t;
cin>>a>>b;
REP(i,,n) sum[i]=sum[i-]+s[i].size();
REP(x,a,b) {
int t = , ans = ;
while (t<=n) {
int l=t,r=n,pos=-;
while (l<=r) {
if (len(t,mid)<=x) pos=mid,l=mid+;
else r=mid-;
}
if (ans) ans += s[t].size()+;
else ans += s[t].size();
t = pos+;
}
printf("%d\n",ans);
}
}

D. Digit Division

求出所有可划分的位置, 如果位置$n$不能划分那么显然无解, 否则为$2^{cnt-1}$

#include <iostream>
#include <sstream>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <set>
#include <map>
#include <queue>
#include <string>
#include <cstring>
#include <bitset>
#include <functional>
#include <random>
#define REP(_i,_a,_n) for(int _i=_a;_i<=_n;++_i)
#define PER(_i,_a,_n) for(int _i=_n;_i>=_a;--_i)
#define hr putchar(10)
#define pb push_back
#define lc (o<<1)
#define rc (lc|1)
#define mid ((l+r)>>1)
#define ls lc,l,mid
#define rs rc,mid+1,r
#define x first
#define y second
#define io std::ios::sync_with_stdio(false)
#define endl '\n'
#define DB(_a) ({REP(_i,1,n) cout<<_a[_i]<<',';hr;})
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int P = 1e9+, INF = 0x3f3f3f3f;
ll gcd(ll a,ll b) {return b?gcd(b,a%b):a;}
ll qpow(ll a,ll n) {ll r=%P;for (a%=P;n;a=a*a%P,n>>=)if(n&)r=r*a%P;return r;}
ll inv(ll x){return x<=?:inv(P%x)*(P-P/x)%P;}
inline int rd() {int x=;char p=getchar();while(p<''||p>'')p=getchar();while(p>=''&&p<='')x=x*+p-'',p=getchar();return x;}
//head const int N = 1e6+;
int n,m;
char s[N]; int main() {
scanf("%d%d%s",&n,&m,s+);
ll t = , cnt = ;
REP(i,,n) {
t = (t*+s[i]-'')%m;
if (!t) ++cnt;
}
if (t) return puts(""),;
printf("%d\n",qpow(,cnt-));
}

F. Frightful Formula

先考虑$c=0$的情况

对于$t_i$, 考虑从$(2,i)$到$(n,n)$的所有路径, 可以得到贡献为$a^{n-i}b^{n-1}\binom{2n-i-2}{n-i}$.

对于$l_i$, 贡献为$a^{n-1}b^{n-i}\binom{2n-i-2}{n-i}$

然后再考虑$c$的贡献, 相当于是以所有点$(i,j)$为起点,终点为$(n,n)$的路径贡献和

也就是$\sum\limits_{i=2}^n\sum\limits_{j=2}^n a^{n-j}b^{n-i}\binom{2n-i-j}{n-i}$

枚举$i+j$,那么这个式子可以看成卷积,然后用任意模数$NTT$来求.

还有一种方法是设$g_{i,j}=f_{i,j}+\frac{c}{a+b-1}$, 那么$g_{i,j}=ag_{i,j-1}+bg_{i-1,j}$, 这样就可以避免求$c$的贡献

#include <iostream>
#include <sstream>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <set>
#include <map>
#include <queue>
#include <string>
#include <cstring>
#include <bitset>
#include <functional>
#include <random>
#define REP(_i,_a,_n) for(int _i=_a;_i<=_n;++_i)
#define PER(_i,_a,_n) for(int _i=_n;_i>=_a;--_i)
#define hr putchar(10)
#define pb push_back
#define lc (o<<1)
#define rc (lc|1)
#define mid ((l+r)>>1)
#define ls lc,l,mid
#define rs rc,mid+1,r
#define x first
#define y second
#define io std::ios::sync_with_stdio(false)
#define endl '\n'
#define DB(_a) ({REP(_i,1,n) cout<<_a[_i]<<',';hr;})
using namespace std;
typedef long long ll;
const int P = 1e6+;
ll qpow(ll a,ll n) {ll r=%P;for (a%=P;n;a=a*a%P,n>>=)if(n&)r=r*a%P;return r;} const int N = 5e5+;
int n,a,b,c,l[N],t[N];
int fac[N],ifac[N],pa[N],pb[N];
ll C(int n, int m) {
return (ll)fac[n]*ifac[m]%P*ifac[n-m]%P;
}
int main() {
scanf("%d%d%d%d",&n,&a,&b,&c);
fac[]=pa[]=pb[]=;
REP(i,,N-) {
pa[i]=(ll)pa[i-]*a%P;
pb[i]=(ll)pb[i-]*b%P;
fac[i]=(ll)fac[i-]*i%P;
}
ifac[N-] = qpow(fac[N-],P-);
PER(i,,N-) ifac[i]=(ll)ifac[i+]*(i+)%P;
int k = (ll)c*qpow(a+b-,P-)%P;
REP(i,,n) scanf("%d",l+i),l[i]=(l[i]+k)%P;
REP(i,,n) scanf("%d",t+i),t[i]=(t[i]+k)%P;
int ans = ;
REP(i,,n) {
ans = (ans+(ll)l[i]*pa[n-]%P*pb[n-i]%P*C(*n-i-,n-i))%P;
ans = (ans+(ll)t[i]*pb[n-]%P*pa[n-i]%P*C(*n-i-,n-i))%P;
}
ans = (ans-k)%P;
if (ans<) ans+=P;
printf("%d\n",ans);
}

K. Kernel Knights

大意: 给定二分图, 每个点出度为$1$. 求一个核, 满足核内的点之间没边, 核外每个点都与核内有一条方向从内向外的边.

出度为$1$, 那么就保证每个点最多属于一个环, 二分图就保证只有偶环. 所以可以先拓排一下, 最后处理一下偶环即可.

#include <iostream>
#include <sstream>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <set>
#include <map>
#include <queue>
#include <string>
#include <cstring>
#include <bitset>
#include <functional>
#include <random>
#define REP(_i,_a,_n) for(int _i=_a;_i<=_n;++_i)
#define PER(_i,_a,_n) for(int _i=_n;_i>=_a;--_i)
#define hr putchar(10)
#define pb push_back
#define lc (o<<1)
#define rc (lc|1)
#define mid ((l+r)>>1)
#define ls lc,l,mid
#define rs rc,mid+1,r
#define x first
#define y second
#define io std::ios::sync_with_stdio(false)
#define endl '\n'
#define DB(_a) ({REP(_i,1,n) cout<<_a[_i]<<',';hr;})
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int P = 1e9+, INF = 0x3f3f3f3f;
ll gcd(ll a,ll b) {return b?gcd(b,a%b):a;}
ll qpow(ll a,ll n) {ll r=%P;for (a%=P;n;a=a*a%P,n>>=)if(n&)r=r*a%P;return r;}
ll inv(ll x){return x<=?:inv(P%x)*(P-P/x)%P;}
inline int rd() {int x=;char p=getchar();while(p<''||p>'')p=getchar();while(p>=''&&p<='')x=x*+p-'',p=getchar();return x;}
//head const int N = 1e6+;
int n, deg[N], nxt[N];
queue<int> q;
int vis[N],ans[N]; int main() {
scanf("%d", &n);
REP(i,,*n) scanf("%d",nxt+i),++deg[nxt[i]];
REP(i,,*n) if (!deg[i]) q.push(i),vis[i]=;
while (q.size()) {
int u = q.front(); q.pop();
int v = nxt[u];
if (ans[u]!=) ans[u] = ;
if (vis[v]) continue;
if (ans[u]==) ans[v]=,vis[v]=,q.push(v);
if (vis[v]) continue;
if (!--deg[v]) vis[v]=,q.push(v);
}
REP(i,,*n) if (!vis[i]) {
int now = i, cur = ;
while (!vis[now]) {
cur ^= ;
vis[now] = ;
if (cur) ans[now] = ;
now = nxt[now];
}
}
REP(i,,*n) if (ans[i]==) printf("%d ",i);hr;
}
05-20 14:44