牛客网Enigmatic Partition

题目描述:

牛客网Enigmatic Partition_第1张图片

 分析:

这题打表。

别问,问就是打表。

首先观察f(n)f(n)f(n)的条件。它是首尾差等于2并且相邻两个差最多为1的递增序列。

那么,我们可以得出式子:
ab1+(a+1)b2+(a+2)b3=nab_1+(a+1)b_2+(a+2)b_3=nab1+(a+1)b2+(a+2)b3=n
a(b1+b2+b3)+b2+2b3=na(b_1+b_2+b_3)+b_2+2b_3=na(b1+b2+b3)+b2+2b3=n
am+b2+2b3=nam+b_2+2b_3=nam+b2+2b3=n
所以我们可以发现,对于一个nnn有444个未知数a,m,b2,b3a,m,b_2,b_3a,m,b2,b3。其中,b2,b3b_2,b_3b2,b3至少为111。

所以我们在程序里只要枚举a,ma,ma,m,然后对于每个a,ma,ma,m,我们只要在上述位置进行加减,然后把差分后的数组搞回原来就可以了。

 

Most important

#include
using namespace std;
long long n,l,r;
long long s[500010],f[500010];
int main()
{
    for(int i=3; i<=100010; i++)
        for(int j=i; j<=100010; j+=i) 
        {
            f[j+3]++;
            f[j+2*i]++;
            f[j+i+1]--;
            f[j+i+2]--;
        }
    for(int i=3; i<=100010; i++) f[i]+=f[i-2];
    for(int i=1; i<=100010; i++) f[i]+=f[i-1];
    for(int i=1; i<=100010; i++) s[i]=s[i-1]+f[i];
    scanf("%d",&n);
    for(int i=1; i<=n; i++)
    {
        scanf("%lld%lld",&l,&r);
        printf("Case #%d: %lld\n",i,s[r]-s[l-1]);
    }
    return 0;
}
View Code

 

你可能感兴趣的:(牛客网Enigmatic Partition)