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


  • 0
    rock    8:10 a.m. 25 Tháng 10, 2024

    var n,i,j,m:longint;
    d:array[0..100001] of int64;
    BEGIN
    readln(n);
    d[0]:=1;
    if n(n+1) div 2 mod 2 = 1 then write('0') else
    begin
    m:=n
    (n+1) div 4;
    for i:=1 to n do
    for j:=m downto i do
    d[j]:=(d[j]+d[j-i]) mod 1000000007;
    write(d[m]*1000000008 div 2 mod 1000000007);
    end;
    END.


    • -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
      }

      2 phản hồi