Đ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\}\) và \(\{2,5,7\}\)
- \(\{1,2,5,6\}\) và \(\{3,4,7\}\)
- \(\{1,2,4,7\}\) và \(\{3,5,6\}\)
- \(\{1,6,7\}\) và \(\{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
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.
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
}