ACM-ICPC 2018 焦作赛区网络预赛(A、J、I、L)

本文通过三个具体的C++程序案例,介绍了字符串处理、快速幂运算和矩阵运算的应用场景及实现方法。首先展示了一个用于字符串匹配的简单程序,接着介绍了一个涉及快速幂计算的例子,最后深入探讨了使用矩阵进行快速幂运算的复杂案例。

A

#include<bits/stdc++.h>
using namespace std;

const int maxn = 1e5 + 10;

char s[maxn];
char str[10] = "jessie";

int main(){
    int t;
    scanf("%d", &t);
    while(t--){
        scanf("%s", s);
        int len = strlen(s);
        for(int i=0;i<len;i++) {
            if(s[i]>='A' && s[i] <= 'Z')
                s[i] += 32;
        }
        if(strcmp(s, str) == 0) puts("Good guy!");
        else puts("Dare you say that again?");
    }
    return 0;
}

 

 

G

#include<bits/stdc++.h>
using namespace std;
#define clr(a) memset(a,0,sizeof(a))
#define line cout<<"----------"<<endl

typedef long long ll;
const ll MOD = 1e9+7;
const ll maxn = 1e5+10;
const ll INF = 0x3f3f3f3f;
const ll MAXN = 1e6+10;

string s;
ll ans = 0;

ll qkm(ll a, ll b, ll c = MOD){
	ll s = 1; a %= c;
	while(b){
		if(b & 1) s = s * 1ll * a % c;
		b >>= 1;
		a = a * 1ll * a % c;
	}
	return s;
}

int main(){
 	ll t;
 	cin >> t;
 	while(t--){
        ans = 0;
 		cin >> s;
 		for(ll i = 0; s[i]; i++){
 			ans = ans * 10 + (s[i] - '0');
 			ans %= (MOD - 1);
 		}
 		ll cnt = qkm(2, ans, MOD) * 1LL % MOD;
 		cnt = cnt *qkm(2, MOD - 2, MOD) % MOD;
 		cnt %= MOD;
        printf("%lld\n",  cnt);
 	}
	return 0;
}

I

#include<bits/stdc++.h>
using namespace std;
int main(){
    int a,b,c;
    while(scanf("%d%d%d",&a,&b,&c)!=EOF) {
        if(a%2==0 || b%2==0 || c%2==0) printf("Yes\n");
        else printf("No\n");
    }
}

 

L

#include<bits/stdc++.h>
using namespace std;
#define clr(a) memset(a,0,sizeof(a))
#define line cout<<"----------"<<endl

typedef long long ll;
const ll Mod = 1000000007;
const ll maxn = 1e5+10;
const ll INF = 0x3f3f3f3f;
const ll MAXN = 1e6+10;
const ll N = 4;

struct Matrix{//定义N*N的矩阵
    ll m[N][N];
};
ll n, ans;
Matrix Mul(Matrix a,Matrix b)//定义矩阵的乘法
{
    Matrix c;
    memset(c.m, 0, sizeof(c.m));
    for(ll i=0; i<N; i++)
        for(ll j=0; j<N; j++)
            for(ll k=0; k<N; k++)
                c.m[i][j] = (c.m[i][j] + (a.m[i][k]*b.m[k][j])%Mod + Mod)%Mod;//根据题意取模
    return c;
}
Matrix fastm(Matrix a,ll n) {//矩阵的快速幂
    Matrix res;
    memset(res.m, 0, sizeof(res.m));
    res.m[0][0] = res.m[1][1] = res.m[2][2] = res.m[3][3] = 1;
    while(n){//快速幂
        if(n & 1)
            res = Mul(res, a);
        a = Mul(a, a);
        n >>= 1;
    }
    return res;
}
int main(){
 	ll t;
 	scanf("%lld", &t);
 	Matrix tot ;
    memset(tot.m,0,sizeof(tot.m));
    tot.m[0][0]  = 106; tot.m[1][0] = 46;
    tot.m[2][0] = 20; tot.m[3][0] = 9;
    Matrix a = {
        2,-1,3,2,
        1,0,0,0,
        0,1,0,0,
        0,0,1,0,
    };
 	while(t--){
        scanf("%lld", &n);
        if(n <= 5){
            if(n == 5) ans = 106;
            else if(n == 4) ans = 46;
            else if(n == 3) ans = 20;
            else if(n == 2) ans = 9;
            else if(n == 1) ans = 3;
        }
        else{
            Matrix res  = fastm(a, n-5);
            res = Mul(res, tot);
            ans = res.m[0][0] % Mod;
        }
        printf("%lld\n", ans);
 	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值