A、夹娃娃


思路:前缀和,卡cin和cout。

#include<bits/stdc++.h>
#define js ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std;
typedef long long ll;
int n,k,l,r;
ll a[100005];
int main() {
    scanf("%d%d",&n,&k);
    for(int i=1;i<=n;++i) scanf("%lld",&a[i]),a[i]+=a[i-1];
    while(k--) {
        scanf("%d%d",&l,&r);
        printf("%lld\n",a[r]-a[l-1]);
    }
    return 0;
}

B、莫的难题


思路:给你一个数,用数字表示,往年蓝桥杯有道题“年号字串”,是用字母表示一个数,其实就是转为26进制,那这里就是5进制了。
需要注意的是,不管是那个题目,不管是蓝桥杯的26进制和这道题的5进制,是没有0的,也就是要考虑26的倍数和5的倍数.
解决方法就是,如果这一位是26或者5就向高位借1。 在90%的数据里是会大于1e9的,也就是说在求快速幂的时候如果不先取余就会溢出,那么就只能a10%了。

Code:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
ll fac[106];
ll qpow(ll x,ll y){
     x %= mod;
    ll ans = 1;
    while(y){
        if(y&1) ans = ans*x%mod;
        x = x*x%mod;
        y >>= 1;
    }
    return ans;
}
char mp[7]={'0','1','2','3','5','9'},a[15];
int pos;
void solve(int n,int flag) {
    n-=(flag==1);
    if(n>5) solve(n/5,n%5==0);
    if(n%5) n%=5;
    else n=5;
    a[pos++]=mp[n];
}
int main() {
    int t,n,m;
    fac[0]=1;
    for(int i=1;i<=105;++i) fac[i]=i*fac[i-1]%mod;
    scanf("%d",&t);
    while(t--) {
        scanf("%d%d",&n,&m);    pos=0;
        ll ans=fac[n]*qpow(fac[m]*fac[n-m],mod-2)%mod;
        solve(ans,0);
        a[pos]='\0';
        puts(a);
    }
    return 0;
}

C、不平衡数组


待补


D、数列统计


打表:X=3
L=1:
ans=1
L=2:
ans=3=X
L=3
ans=3+2+1=x+...+1=
L=4
ans==
L=5
可以根据前面的递推结果猜到现在应该是,验证后还真是,那么递推式就有了:
组合数用逆元+阶乘求就可以了。
Code:

#pragma GCC target("avx,sse2,sse3,sse4,popcnt")
#pragma GCC optimize("O2,O3,Ofast,inline,unroll-all-loops,-ffast-math")
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define js ios::sync_with_stdio(false);cin.tie(0); cout.tie(0)
#define pb push_back
#define pll pair<ll,ll>
#define INF 0x3f3f3f3f
const int mod = 911451407;
const int maxn = 100005;
#define stop system("pause")
inline ll read(){
    ll s = 0, w = 1; char ch = getchar();
    while (ch < 48 || ch > 57) { if (ch == '-') w = -1; ch = getchar(); }
    while (ch >= 48 && ch <= 57) s = (s << 1) + (s << 3) + (ch ^ 48), ch = getchar();
    return s * w;
}
ll fac[2000005];
ll qpow(ll x,ll y){
     x %= mod;
    ll ans = 1;
    while(y){
        if(y&1) ans = ans*x%mod;
        x = x*x%mod;
        y >>= 1;
    }
    return ans;
}
int main(){
    fac[0] = 1;
    for(int i = 1 ; i < 2000005 ; ++i) fac[i] = fac[i-1]*i%mod;
    int t = read();
    while(t--){
        ll l = read(),x= read();
        ll ans = fac[x+l-2]*qpow(fac[x-1],911451405)%mod;
        ans = ans*qpow(fac[l-1],911451405)%mod;
        cout<<ans<<endl;
    }
}