AtCoder Beginner Contest 162

C

在這裏插入圖片描述
範圍很小,直接暴力。
D
給你一個字符串,這個字符串中只有R,G,BR,G,B。讓你找三元組(i,j,k)(i,j,k)的數量,滿足i<j<k&&ji!=kji<j<k\&\&j-i!=k-j並且s[i]!=s[j],s[i]!=s[k],s[j]!=s[k]s[i]!=s[j],s[i]!=s[k],s[j]!=s[k]
思路:
n2n^2枚舉字符,若找到兩個不同的字符,s[i],s[j]s[i],s[j],在從jj後面找與這兩個字符不相同的字符的數量,累加即可。複雜度n2log(n)n^2log(n)
注意別忘了ji!=kjj-i!=k-j這個條件。

or<int> g[5];
char s[N];
int main(){
    int n = read();
    scanf("%s",s+1);
    rep(i,1,n){
        if(s[i] == 'R') g[1].push_back(i);
        else if(s[i] == 'G') g[2].push_back(i);
        else g[3].push_back(i);
    }
    ll ans = 0;
    rep(i,1,n-2){
        rep(j,i+1,n-1){
            if(s[i]!=s[j]){
                int d = j - i;
                int l = 0,r ;
                int op = 1;
               // cout<<i<<' '<<j<<endl;
                if(s[i]!='R'&&s[j]!='R') op = 1;
                else if(s[i]!='G'&&s[j]!='G') op = 2;
                else if(s[i]!='B'&&s[j]!='B') op = 3;
                int sz = g[op].size();
                r = sz;
                while(l < r){
                    int mid = l + r >> 1;
                    if(g[op][mid] > j) r = mid;
                    else l = mid + 1;
                }
                if(r != sz) {
					ans += sz - r;
                	if(j+d<=n&&s[j+d]!=s[i]&&s[j+d]!=s[j]) ans --;
            	}
            }
        }
    }
    cout << ans;
}

E
題意:
給你nn個數,然後每個數的範圍爲[1,k][1,k]。讓你求這個序列所有可能的情況時gcdgcd的和。
思路:
容斥。
dp[i]dp[i]爲最大公約數爲ii的序列的數量。
最大公約數爲ii,序列中所有數都是ii的倍數。每個數可取的值有k/ik/i個,一共nn個數,所以共(k/i)n(k/i)^n中情況。但是這裏面都重複的,最大公約數爲2i,3i,4i....2\cdot i,3\cdot i,4\cdot i....,我們要減去這些序列的數量。所以我們倒着枚舉最大公約數就很好處理了。

ll Qpow(ll a,ll b,ll p){
    a = (a % p + p)%p;
    ll ans = 1;
    while(b){
        if(b&1) ans = ans * a % p;
        b >>= 1;
        a = a * a%p;
    }
    return ans;
}
ll dp[N];
int main(){
    ll n = read(),k = read();
    ll ans = 0;
    for(int i = k; i >= 1; -- i){
        dp[i] = Qpow(k/i,n,mod);
        for(int j = 2 * i;j <= k;j += i) dp[i] = (dp[i]-dp[j]+mod)%mod;
        ans = (ans + 1LL*i*dp[i]+mod)%mod;
    }
    cout << ans;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章