Can someone help me find a counterexample on Atcoder beginner problem F?
Difference between en1 and en2, changed 168 character(s)
Problem : https://atcoder.jp/contests/abc171/tasks/abc171_f↵
↵
Ill explain my idea below with the first example.↵
↵
_______ o ___________ o ________ f __________↵
↵
we are able to place letters in the 4 slots here.↵
↵
Lets say that we place ↵
a letters on the first slot, b letters on the second,↵
c letters on the third, and d letters on the fourth slot.↵
therefore, a+b+c+d = n.↵
↵
The first slot is free to place slot -> we have 26^a ways to put it.↵
↵
The second slot, third slot, fourth slots have a restriction;↵
you cannot place the letter that is at the left of the slot.↵
(you can't place o in the second, third slot, you can't place f in the fourth slot)↵
-> by this restriction, we can prevent duplicates being counted.↵
-> ex) ooaoaaof -> this will be only counted one time.↵
-> therefore, there's 25^(b+c+d) = 26^(n-a) ways to put in the slots.↵
↵
if a is 0, b+c+d = n.↵
the ways to distribute numbers to b, c, d is H(3,n)=C(3+n-1, n).↵
↵
if a is 1, b+c+d = n-1.↵
the ways to distribute numbers to b, c, d is H(3,n-1)=C(3+n-1-1, n-1)↵
↵
...↵
↵
if a is n, b+c+d = 0↵
the ways to distribute numbers to b, c, d is H(3,0)=C(3+0-1, 0).↵
↵
--↵
therefore the total = sigma k=0 to n (26^k * 25^n-k * H(len(S)-1,n-k))↵
↵
there was my logic, and I coded it but it came with a result of only 70 out of 100.↵
↵
Can someone help me finding the counterexample?↵
↵
Code below:↵
`#include <iostream>
`↵
`#include <vector>`↵
`#include <cmath>`↵
`#include <algorithm>`↵
`#include <climits>`↵
`#include <set>`↵
`#include <map>`↵
`#include <queue>`↵
`#include <deque>`↵
`#include <stack>`↵
`#include <string>`↵
`#include <list>`↵
`#include <ctime>`↵
`#include <complex>`↵
`#include <bitset>`↵
`#include <tuple>`↵
``↵
`#define ff first`↵
`#define ss second`↵
`#define MOD 1000000007LL`↵
``↵
`using namespace std;`↵
`using pii = pair<int, int>;`↵
`using ll = long long;`↵
``↵
`vector<ll> f(3000000);`↵
``↵
`tuple<ll, ll, ll> exgcd(ll a, ll b) {`↵
`    if (b == 0)`↵
`        return make_tuple(a, 1, 0);`↵
`    ll g, x, y;`↵
`    tie(g, x, y) = exgcd(b, a % b);`↵
`    return make_tuple(g, y, x &mdash; (a / b) * y);`↵
}↵
`}`↵
``
↵
`ll moddiv(ll a, ll b)`↵
{`{`↵
`    ll bb;`↵
`    tie(ignore, bb, ignore) = exgcd(b, MOD);`↵
`    if (bb < 0) b += MOD;`↵
`    return (a * bb) % MOD;`↵
}↵
`}`↵
``
↵
`ll getC(int a, int b)`↵
{`{`↵
`    if (a < b) return 0;`↵
`    return moddiv(moddiv(f[a], f[a &mdash; b]), f[b]);`↵
}↵
`}`↵
``
↵
`ll getH(int a, int b)`↵
{`{`↵
`    return getC(a + b &mdash; 1, b);`↵
}↵
`}`↵
``
↵
`int main()`↵
{`{`↵
`    ios::sync_with_stdio(false);`↵
`    cin.tie(0);`↵
``↵
`    f[0] = 1;`↵
`    for (int i = 1; i < f.size(); i++) f[i] = (f[i - 1] * i) % MOD;`↵
``↵
`    int k;`↵
`    cin >> k;`↵
`    string s;`↵
`    cin >> s;`↵
`    ll answer = 0;`↵
`    vector<ll> p26(k + 1), p25(k + 1);`↵
`    p26[0] = p25[0] = 1;`↵
`    for (int i = 1; i <= k; i++) {`↵
`        p26[i] = (p26[i - 1] * 26) % MOD;`↵
`        p25[i] = (p25[i - 1] * 25) % MOD;`↵
`    }`↵
`    for (int i = 0; i <= k; i++) {`↵
`        ll tmp = (p26[i] * getH(s.length(), k - i)) % MOD;`↵
`        tmp = (tmp * p25[k - i]) % MOD;`↵
`        answer = (answer + tmp) % MOD;`↵
`    }`↵
`    cout << answer;`↵
``↵
`    return 0;`↵
}↵
↵
`}`↵
``
↵
`
`

History

 
 
 
 
Revisions
 
 
  Rev. Lang. By When Δ Comment
en6 English Wonsei 2020-06-21 18:45:27 8
en5 English Wonsei 2020-06-21 18:03:30 2 Tiny change: 'b+c+d) = 26^(n-a) way' -> 'b+c+d) = 25^(n-a) way'
en4 English Wonsei 2020-06-21 18:01:56 2 Tiny change: '* H(len(S)-1,n-k))\n\n' -> '* H(len(S),n-k))\n\n'
en3 English Wonsei 2020-06-21 17:58:22 208
en2 English Wonsei 2020-06-21 17:56:09 168
en1 English Wonsei 2020-06-21 17:55:09 3102 Initial revision (published)