题意:一共有n个数,第i个数是xi, xi可以取 [li , ri] 中任意的一个值。
设 S =图片说明 图片说明 ,求S种类数?

思路:bitset,01背包
bit[i]为前i个数中能得到的值的那一位为1,否则为0;
当加上x[i+1]的平方时相当于bit[i]向左平移了x[i+1]的平方个位置
所以bit[i]=bit[i]|(bit[i-1]<<图片说明 );

代码:

#include<bits/stdc++.h>
#define ll long long
#define inf 1000000007

using namespace std;

bitset<1000005> bit[105];

int main()
{
    int n;
    scanf("%d",&n);
    int z=0;
    bit[0][0]=1;
    for(int i=1; i<=n; i++)
    {
        int l, r;
        scanf("%d %d",&l,&r);
        for(int j=l;j<=r;j++)
        {
            bit[i]=bit[i]|(bit[i-1]<<j*j);
        }
    }
    cout << bit[n].count() << endl;
    return 0;
}