题目大意
给定一个
k
按以下方式生成一个序列
给出一个询问
[L,R]
,求
∑ri=lh(i)×Si
,
h(i)=⌊[i mod 20010116]2+i+804233⌋
答案对
232
取模,
T
组数据。
Data Constraint
题解
首先观察题目性质可以发现,
Si
其实就是
i
在
所以
SRC
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std ;
#define N 100 + 10
typedef long long ll ;
typedef unsigned int Uint ;
const ll MO = 20000116 ;
ll P[N] , a[N] ;
int T , k ;
ll L , R ;
Uint ans ;
inline ll h( ll i ) { return ((i % MO) * (i % MO) + i + 804) / 233 ; }
ll Calc( ll w ) {
memset( a , 0 , sizeof(a) ) ;
int Si = 0 ;
while ( w ) {
a[++a[0]] = w % k ;
Si = (Si + a[a[0]]) ;
w = w / k ;
}
return Si ;
}
int main() {
freopen( "fantasy.in" , "r" , stdin ) ;
freopen( "fantasy.out" , "w" , stdout ) ;
scanf( "%d" , &T ) ;
while ( T -- ) {
ans = 0 ;
scanf( "%d%lld%lld" , &k , &L , &R ) ;
L ++ , R ++ ;
int st = log(L) / log(k) ;
if ( P[st] == L ) st -- ;
ll Sum = Calc(L-1) ;
ans += h(L-1) * (Sum % k) ;
for (ll i = L + 1 ; i <= R ; i ++ ) {
a[1] ++ , Sum ++ ;
if ( a[1] == k ) {
int j = 1 ;
while ( a[j] >= k ) {
a[j+1] += 1 ;
a[j] -= k ;
Sum -= k - 1 ;
j ++ ;
}
}
ans = (ans + h(i-1) * (Sum % k)) ;
}
cout << ans << endl ;
}
return 0 ;
}
以上.