列表

详情


NC14295. Mod

描述

输入描述

第一行一个询问组数。
接下来每一行x,P,Q,L,R,T,S。

输出描述

每行一个答案。

示例1

输入:

2
77 -129 383 -575 86 515 -464
992 115 926 351 536 543 655

输出:

492
146

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 245ms, 内存消耗: 1060K, 提交时间: 2022-06-07 09:53:12

#include<bits/stdc++.h>
#ifdef xay5421
#define D(...) fprintf(stderr,__VA_ARGS__)
#define DD(...) D(#__VA_ARGS__ "="),debug_helper::debug(__VA_ARGS__),D("\n")
#include"/home/xay5421/debug.hpp"
#else
#define D(...) ((void)0)
#define DD(...) ((void)0)
#endif
#define pb push_back
#define eb emplace_back
#define SZ(x) ((int)(x).size())
#define each(x,v) for(auto&x:v)
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
#define per(i,a,b) for(int i=(a);i>=(b);--i)
template<class T>void rd(T&x){int f=0,c;while(!isdigit(c=getchar()))f^=!(c^45);x=(c&15);while(isdigit(c=getchar()))x=x*10+(c&15);if(f)x=-x;}
template<class T>void pt(T x,int c=-1){if(x<0)putchar('-'),x=-x;if(x>9)pt(x/10);putchar(x%10+48);if(c!=-1)putchar(c);}
using namespace std;
using LL=long long;
using ULL=unsigned long long;
ULL C2(LL n){
	if(n&1)return 1ULL*n*((n-1)>>1);
	else return 1ULL*(n>>1)*(n-1);
}
ULL sol(LL n,LL a,LL b,LL c){
	if(!n)return 0;
	if(!a)return ULL(n)*(b/c);
	if(a>=c||b>=c){
		return sol(n,a%c,b%c,c)+1ULL*(b/c)*n+1ULL*(a/c)*C2(n);
	}
	LL m=((__int128)a*(n-1)+b)/c;
	return 1ULL*(n-1)*m-sol(m,c,c-b-1,a);
}
ULL calc(LL x,LL S,LL R,LL Q,LL T){
	
	return sol(R,S,x+T,T)-sol(R,S,x+T-Q,T);
	
	ULL ret=0;
	for(LL k=0;k<R;++k){
		ret+=(x+k*S+T)/T;
	}
	for(LL k=0;k<R;++k){
		ret-=(x+k*S+T-Q)/T;
	}
	return ret;
}
int main(){
#ifdef xay5421
	freopen("a.in","r",stdin);
#endif
	int tc;
	rd(tc);
	while(tc--){
		LL x,P,Q,L,R,T,S;
		rd(x),rd(P),rd(Q),rd(L),rd(R),rd(T),rd(S);
		x=(x%T+T)%T;
		S=(S%T+T)%T;
		LL tmp=(-L+T-1)/T;
		L+=tmp*T,R+=tmp*T;
		P=max(P,0LL);
		Q=min(Q,T);
		if(L>=R||P>=Q){
			puts("0");
			continue;
		}
		printf("%lld\n",(calc(x,S,R,Q,T)-calc(x,S,R,P,T))-(calc(x,S,L,Q,T)-calc(x,S,L,P,T)));
	}
	return 0;
}

上一题