2020牛客多校第八场E-Enigmatic Partition(隔项差分)

Description

2020牛客多校第八场E-Enigmatic Partition(隔项差分)_第1张图片

Solution

  • 由题意
    2020牛客多校第八场E-Enigmatic Partition(隔项差分)_第2张图片
    ∴    n = a 1 ∗ b 1 + a 2 ∗ b 2 + a 3 ∗ b 3 _\therefore\,\,n=a_1*b_1+a_2*b_2+a_3*b_3 n=a1b1+a2b2+a3b3
    ∵    a 1 + 2 = a 2 + 1 = a 3 _\because\,\,a_1+2=a_2+1=a_3 a1+2=a2+1=a3
    ∴    n = a 1 ∗ ( b 1 + b 2 + b 3 ) + b 2 + b 3 ∗ 2 = a ∗ m + b 2 + b 3 ∗ 2 _\therefore\,\,n=a_1*(b_1+b_2+b_3)+b_2+b_3*2=a*m+b_2+b_3*2 n=a1(b1+b2+b3)+b2+b32=am+b2+b32

a = 1 , m = 7 a=1,m=7 a=1,m=7为例

n n n 10 11 12 13 14 15 16 17 18 19 20 21
5个3 1233333
4个3 1123333 1223333
3个3 1112333 1122333 1222333
2个3 1111233 1112233 1122233 1222233
1个3 1111123 1111223 1112223 1122223 1222223
n u m num num 1 1 2 2 3 2 2 1 1 0 0 0
差分序列 1 0 1 0 1 -1 0 -1 0 -1 0 0
隔项差分 1 0 0 0 0 -1 -1 0 0 0 0 1
对应位置 am+3 0 0 0 0 (a+1)m+1 (a+1)m+2 0 0 0 0 (a+2)m
  • 所以我们只用在对应位置上加减,最后再还原为原序列即为 f ( n ) f(n) f(n)
  • 数据范围允许我们预处理出 f ( n ) f(n) f(n)的前缀和, O ( 1 ) O(1) O(1)查询

Details

  • ( a + 2 ) ∗ m (a+2)*m (a+2)m等项处理时可能超出 N N N,适当扩大内存
  • 为避免判 a ≤ N m a\leq \frac{N}{m} amN时整除与否带来的问题,我们把 a ∗ m a*m am合在一起处理,即for(a=m;a

Code

#include 
#include 
#define ll long long
const int N=1e5+10;
ll T,cas,l,r,s[N<<1],f[N<<2];
int main()
{
	register int i,m,a;
	for(m=3;m<N;++m)for(a=m;a<N;a+=m) ++f[a+3],++f[a+2*m],--f[a+m+1],--f[a+m+2];
	for(i=3;i<N;++i) f[i]+=f[i-2];
	for(i=1;i<N;++i) f[i]+=f[i-1];
	for(i=1;i<N;++i) s[i]=s[i-1]+f[i];
	scanf("%lld",&T);
	while(T--) scanf("%lld%lld",&l,&r),printf("Case #%d: %lld\n",++cas,s[r]-s[l-1]);
}

Summary

k u a n g b i n kuangbin kuangbin的题总是很考验思维,想清楚了就是签到题

你可能感兴趣的:(2020牛客暑期多校训练营)