李师傅姿势太好让我好好膜膜怎么写70分暴力
都是套路题,想法题,想到了只要三分钟十几行就写好了,想不到一辈子都GG,于是我光荣地写大暴力,反正姿势比jlh要好一点拿了40分。
还有就是莫名其妙升紫了。
题解部分
T1
传说中的找规律,据说是可行的方案只出现在一段区间,并且0不会一起出现,如下表
是不是根本看不懂发生了什么?我也不知道发生了什么。。。反正就是根本不可能知道规律的呀。。。。
然后假装你已经知道了规律是怎么样的,只要枚举第一个串,处理第二个串的可行方案就好了。
代码如下:
//orz orz rng_58
#pragma GCC optimize ("O2")
#include <bits/stdc++.h>
#define M 1000010
using namespace std;
int n,m,i,j,k;char a[M],b[M];
int c[200][200];long long ans;
int main(){
for(scanf("%s%s",a,b),n=strlen(a),m=strlen(b),j=1,i=0;i<n&&k<j;i++){
for(;a[i]!=b[j-1]&&j<m;) c[b[j-1]][b[j]]++,j++;
ans+=(i==0||a[i]==a[i-1])?(j-k):(j-k-c[a[i]][a[i-1]]);
if(a[i]==b[k]){
if(j>k+1) c[b[k]][b[k+1]]--;k++;
}if(j<m){
if(j>k) c[b[j-1]][b[j]]++;j++;
}
}return cout<<ans<<endl,0;
}
T2
如果你仔细运算过了的话,你就会惊讶的发现一个很神奇的规律,就是区间长度(r-l)相同的是可以互相算出来的,所以你只要枚举所给区间要求的右边,然后求一下gcd,然后算一算,十几行就好了。
代码如下:
//orz orz rng_58
#pragma GCC optimize ("O2")
#include <bits/stdc++.h>
#define M 100010
using namespace std;
int n,m,i,j,x,t,tot;
int a[M];long long ans;
inline int gcd(int x,int y){
if(x<y) swap(x,y);
if(!y) return x;
return gcd(y,x%y);
}
int main(){
for(scanf("%d%d",&n,&m),i=1;i<=n;i++)
scanf("%d",&x),t=gcd(t,x-1);
for(i=1;i*i<t;i++)
if(t%i==0) a[++tot]=i,a[++tot]=t/i;
if(i*i==t) a[++tot]=i;
for(i=1;i<=tot;i++) if(a[i]%2)
for(j=a[i];j<=m;j*=2) ans+=m-j;
return cout<<ans<<endl,0;
}
刚开始gcd里return gcd(y,x%y);
写成了return(y,x%y);
WA掉了,但居然过了一个点。。。。
T3
太难了,不会。。。。据说先是打表找规律,然后DP,
反正我不会。。。。