• 20201029


    T1

    首先不得不说,这道题虽然表面上看着算法很高深通常来说,这类题都需要(KMP),(AC)自动机,之类的。但是由于考试时间对于我来说并不是太多,所以我就直接莽了一下,直接暴力匹配,发现样例竟然一次过了。然后其实期望得分是(60~90 pts),然而我没注意到两个(len)相乘会瞬见爆炸,然后就只得了(30 pts)。看完题解发现自己好笨,题解做法十分巧妙,将两个子串相加判断,因为当子串搜到了超出任意一个字串的长度时,那么长的那个字串的前(len1)位一定与短的字符串相同,如此计算,运算大大减小。很轻松就(A)了(发现我的朴素做法居然跑得最快,虽然空间也最大)。

    Code

    cpp
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #include<queue>
    #define scy(x) freopen(x".in","r",stdin); freopen(x".out","w",stdout);
    using namespace std;
    const int maxn=2e5+7;
    inline int read() {
    	int x=0,f=1;
    	char ch=getchar();
    	while(ch>'9'||ch<'0') {
    		if(ch=='-') f=-1;
    		ch=getchar();
    	}
    	while(ch>='0'&&ch<='9') {
    		x=(x<<1)+(x<<3)+(ch^48);
    		ch=getchar();
    	}
    	return x*f;
    }
    
    char s[maxn],s1[maxn];
    int a[maxn],a1[maxn];
    int n;
    int main() {
    	scy("string");
    	n=read();
    	for(int i=1; i<=n; i++) {
    		scanf("%s",s+1);
    		int len1=strlen(s+1);
    		scanf("%s",s1+1);
    		int len2=strlen(s1+1);
    		for(int i=1; i<=len1+len2; i++) {
    			if(i<=len1) a[i]=s[i]-'a';
    			a[i+len1]=s1[i]-'a';
    		}
    		for(int i=1; i<=len2+len1; i++) {
    			if(i<=len2)	a1[i]=s1[i]-'a';
    			a1[i+len2]=s[i]-'a';
    		}
    		for(int i=1; i<=len1+len2; i++) {
    			if(i>len1) a[i]=a[i-len1];
    			if(i>len2) a1[i]=a1[i-len2];
    			if(a[i]>a1[i]) {
    				printf(">
    ");
    				break;
    			}
    			if(a[i]<a1[i]) {
    				printf("<
    ");
    				break;
    			}
    			if(i==len1+len2&&a[i]==a1[i]) {
    				printf("=
    ");
    				break;
    			}
    		}
    	}
    	return 0;
    }
    

    T2

    当时考场上做(T2)的时候其实时间也就剩了(1)个小时,看了一眼别的题之后还是选择做这道题,经过思考后不难想到肯定跟根号的系数有关,与化简完后的根号内的数无多大关联。我当时马上就敲了一个快速幂,然后想枚举快速幂从大到小逼近(m),然后如果m%qpow==0直接输出此时的i值,也就是系数。后来之后想到了跟组合数有关,但是考场没时间了,过了样例(可水了),然后就交了,然后喜踢爆(0),看完题解之后明白了咋写组合数,然后问题就迎刃而解了。但是我求系数的方法复杂度为(O(n)),而正解要求(O(sqrt n)),然后就只有(90 pts)。(交的时候又一次因为快速幂没模爆(0)了)。

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #include<queue>
    const int maxn = 1000000;
    #define scy(x) freopen(x".in","r",stdin);freopen(x".out","w",stdout);
    #define int long long
    const int mod=1e9+7;
    using namespace std;
    int fac[maxn];
    inline int read() {
    	int x=0,f=1;
    	char ch=getchar();
    	while(ch>'9'||ch<'0') {
    		if(ch=='-') f=-1;
    		ch=getchar();
    	}
    	while(ch>='0'&&ch<='9') {
    		x=(x<<1)+(x<<3)+(ch^48);
    		ch=getchar();
    	}
    	return x*f;
    }
    
    int qpow(int a,int b) {
    	int ret=1;
    	while(b) {
    		if(b&1) ret=ret*a;
    		a=a*a;
    		b=b/2;
    	}
    	return ret;
    }
    
    int C(int a, int b) {
        if (a == 0 || a < b) {
            return 0;
        }
        if (b == 0) {
            return 1;
        }
        return fac[a] * qpow(fac[b], mod - 2) % mod * qpow(fac[a - b], mod - 2) % mod;
    }
    
    int n,m;
    int n1=0,mi=0,sum;
    signed main() {
    	scy("structure");
    	n=read(),m=read();
    	fac[0]=1;
    	  for (int i = 1; i < maxn; ++i) {
            fac[i] = 1ll * i * fac[i - 1] % mod;
        }
    	while(mi<m) {
    		n1++;
    		mi=qpow(n1,2);
    	}
    	for(int i=n1-1; i>=1;i--) {
          if(m%qpow(i,2)==0){ 
    	  sum=i;
           break;
    	  }
    }
    	printf("%lld
    ",C(sum+n-1,sum));
    		return 0;
    	}
    

    对了这题(std)还锅了(简直就是某国集附体)。

  • 相关阅读:
    java 调用webService的各种方法
    log4j.properties配置详细
    js的with语句使用方法
    Hibernate 拦截器 Hibernate 监听器
    Axis1.4 WebService
    Servlet
    ROOT android 原理。 基于(zergRush)
    创建固定大小的文件 Linux shell 脚本编写实例
    makefile 自动推导命令
    makefile的变量定义和赋值
  • 原文地址:https://www.cnblogs.com/scy-fisheep/p/13898679.html
Copyright © 2020-2023  润新知