CSES - Two Sets II | Hai tập hợp II

Xem PDF

Điểm: 1600 (p) Thời gian: 1.0s Bộ nhớ: 512M Input: bàn phím Output: màn hình

Hãy đếm số cách mà các số \(1, 2,\ldots,n\) có thể được chia thành hai tập hợp có tổng bằng nhau.

Ví dụ, với \(n = 7\), có \(4\) cách chia:

  • \(\{1,3,4,6\}\)\(\{2,5,7\}\)
  • \(\{1,2,5,6\}\)\(\{3,4,7\}\)
  • \(\{1,2,4,7\}\)\(\{3,5,6\}\)
  • \(\{1,6,7\}\)\(\{2,3,4,5\}\)

Input

  • Gồm một dòng duy nhất chứa số nguyên \(n\).

Output

  • In đáp án - số cách thoả mãn chia lấy dư cho \(10 ^ 9 + 7\).

Constraints

  • \(1 \leq n \leq 500\)

Example

Sample input

7

Sample output

4


Bình luận


  • -1
    An2009    10:21 p.m. 2 Tháng 8, 2024

    dành cho các bạn bí ý tưởng cần code để hiểu th nhé:

    include<bits/stdc++.h>

    using namespace std;
    template<typename... T>
    void see(T&... args) { ((cin >> args), ...);}
    template<typename... T>
    void put(T&&... args) { ((cout << args << " "), ...);}
    template<typename... T>
    void putl(T&&... args) { ((cout << args << " "), ...); cout<<'\n';}

    define error(args...)

    void err(istream_iterator<string> it) {}
    template<typename T, typename... Args>
    void err(istream_iterator<string> it, T a, Args... args) {cerr << *it << "=" << a << ", "; err(++it, args...);}

    define int long long

    define pb push_back

    define F first

    define S second

    define ll long long

    define ull unsigned long long

    define ld long double

    define pii pair<int,int>

    define vi vector<int>

    define vii vector<pii>

    define vc vector

    define L cout<<'\n';

    define E cerr<<'\n';

    define all(x) x.begin(),x.end()

    define rep(i,a,b) for (int i=a; i<b; ++i)

    define rev(i,a,b) for (int i=a; i>b; --i)

    define IOS ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);

    define setpr(x) cout<<setprecision(x)<<fixed

    define sz size()

    define seea(a,x,y) for(int i=x;i<y;i++){cin>>a[i];}

    define seev(v,n) for(int i=0;i<n;i++){int x; cin>>x; v.push_back(x);}

    define sees(s,n) for(int i=0;i<n;i++){int x; cin>>x; s.insert(x);}

    const ll inf = INT_MAX;
    const ld ep = 0.0000001;
    const ld pi = acos(-1.0);
    const ll md = 1000000007;

    int dp[500005];
    void solve(){
    int n; see(n);
    if (n%4!=0 && n%4!=3) {put(0); return;}
    vi v;
    int s = (n+1)*n/4;dp[0]=1;
    rep(i,1,n) v.pb(i);
    rep(i,0,n-1){
    rev(j,s,0){
    if (j-v[i]>=0) (dp[j]+=dp[j-v[i]])%=md;
    }
    }
    put(dp[s]);
    }
    signed main(){
    IOS;
    #ifdef LOCAL
    freopen("input.txt", "r" , stdin);
    freopen("output.txt", "w", stdout);
    #endif
    int t=1;
    //cin>>t;
    while(t--){
    solve();
    //cout<<'\n';
    }
    #ifdef LOCAL
    clock_t tStart = clock();
    cerr<<fixed<<setprecision(10)<<"\nTime Taken: "<<(double)(clock()- tStart)/CLOCKS_PER_SEC<<endl;
    #endif
    }

  • 1 bình luận nữa