bitset

题目描述

一共有 nnn个数,第 iii 个数 xix_ixi​​ 可以取 [ai,bi][a_i , b_i][ai​​,bi​​] 中任意值。
S=∑xi2S = \sum{{x_i}^2}S=xi​​2​​,求 SSS 种类数。

输入格式

第一行一个数 nnn。
然后 nnn 行,每行两个数表示 ai,bia_i,b_iai​​,bi​​。

输出格式

输出一行一个数表示答案。

样例

样例输入

5
1 2
2 3
3 4
4 5
5 6

样例输出

26

数据范围与提示

1≤n,ai,bi≤1001 \le n , a_i , b_i \le 1001n,ai​​,bi​​100

题意 : 给你 n 个数字,每个数的范围是 a - b , 问将 n 个数字的平方和累加最终的和可能有多少个

思路分析 : 因为所有数据的范围均小于100,会发现最终最大的和是 1000000, 因此一个比较明显的暴力的做法就是 n^2*1000000

代码示例 :

#define ll long long
const int maxn = 1e6+5;

bitset<maxn>bs[2];
int n;
int a[105][2];

void solve(){
    bs[0][0] = 1;
    int k = 1;
    
    for(int i = 1; i <= n; i++){
        bs[k].reset();
        for(int j = a[i][0]; j <= a[i][1]; j++){
            bs[k] |= (bs[k^1] << (j*j));        
        }
        k ^= 1;
    }
    k ^= 1;
    int ans = 0;
    for(int i = 0; i <= 1000000; i++) {
        if (bs[k][i]) ans++;
    }
    printf("%d\n", ans);
}

int main() {
    //freopen("in.txt", "r", stdin);
    //freopen("out.txt", "w", stdout);
    
    cin >> n;
    for(int i = 1; i <= n; i++) scanf("%d%d", &a[i][0], &a[i][1]);
    
    solve();
    return 0;
}

 

posted @ 2018-09-19 09:28  楼主好菜啊  阅读(201)  评论(0编辑  收藏  举报