T1 sequence
ummmmm,结论推错很棒哟。。。。
迭代几次可以得到一个等比数列,那么b就是一个一次常量,若|a|<1只会无限接近于某个值而无法达到无穷大。
然后就是a=-1,a=0,a+b=1的时候非法
我太蔡了
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL x=1e9;
LL a,b;
int main(){
while(scanf("%lld%lld",&a,&b)!=EOF){
if(a==x){
if(!b) puts("no");
else puts("yes");
}else{
if(abs(a)<=x||a+b==x) puts("no");
else puts("yes");
}
}
}
T2 单词
算到是个dp,但没想到压维QAQ
整个串因为n*m<=1e5,所以当m>12时可以直接暴力n^2m做法,m<=12的时候可以考虑将整个串压成一个三进制数,dp[i][j]表示串为i有j个相同的对数。
显然有初始串dp[i][m]+=1,然后一位一位修改,每次修改一个位置dp[j][k-1]+=dp[i][k],最后统计一下即可。
(数据范围搞错调了半天过艹
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL MAXN=531441;
const LL MAXP=21;
LL n,m;
string s[100010];
LL ans[100010];
LL f[MAXN][MAXP],g[MAXN][MAXP];
LL mi[MAXP],exist[MAXN];
void pre(){
mi[0]=1;
for(LL i=1;i<=m;++i) mi[i]=mi[i-1]*3;
for(LL i=1;i<=n;++i) cin>>s[i];
for(LL i=1;i<=n;++i){
LL now=0;
for(LL j=0;j<m;++j){
now*=3;
now+=s[i][j]-'x';
}
++exist[now];
}
}
void solve(){
pre();
for(LL i=0;i<mi[m];++i) g[i][m]=exist[i];
for(LL i=0;i<m;++i){
memcpy(f,g,sizeof(f));
for(LL j=0;j<mi[m];++j){
LL tmp1=(j/mi[i])%3,tmp2=j-tmp1*mi[i];
for(LL t=0;t<mi[i]*3;t+=mi[i]){
if(t!=tmp1*mi[i]){
for(LL p=m-i;p<=m;++p) f[tmp2+t][p-1]+=g[j][p];
}
}
}
memcpy(g,f,sizeof(g));
}
for(LL i=0;i<mi[m];++i){
for(LL p=0;p<=m;++p){
ans[p]+=exist[i]*g[i][p];
}
}
ans[m]-=n;
for(LL i=0;i<=m;++i) cout<<ans[i]/2<<'\n';
}
int main(){
scanf("%lld%lld",&n,&m);
if(m<=12){
solve();
}
else{
for(LL i=1;i<=n;++i) cin>>s[i];
for(LL i=1;i<=n;++i){
for(LL j=1;j<i;++j){
LL cnt=0;
for(LL k=0;k<m;++k) if(s[i][k]==s[j][k]) ++cnt;
++ans[cnt];
}
}
for(LL i=0;i<=m;++i) cout<<ans[i]<<'\n';
}
}
T3
这个结论易证可还行
wsm出现了LCT这种东西
咕咕咕