E. Calendar Ambiguity(思维&数论)

E. Calendar Ambiguity(思维&数论)

思路:思维&数论。

考虑 i i j j = j =j i i 日。

即: { [ ( i 1 ) × d + j ] [ ( j 1 ) × d + i ] } ( m o d w ) = 0 \lbrace[(i-1)\times d+j]-[(j-1)\times d+i]\rbrace\pmod w=0

( d 1 ) ( i j ) ( m o d w ) = 0 , ( j < i ) (d-1)(i-j)\pmod w=0,(j<i)

g = g c d ( d 1 , w ) g=gcd(d-1,w)

我们只需 ( i j ) (i-j) w g \dfrac{w}{g} 的倍数即可。

w = w g w'=\dfrac{w}{g}

因为可能存在 i i j j 日,而不存在 j j i i 日。

所以取 m = m i n ( n , d ) m=min(n,d) i m i\leq m ,保证存在这样的一对。

考虑枚举不同 i i 的贡献。

i = m i=m ,贡献为: m 1 w \dfrac{m-1}{w'}

i = m 1 , i=m-1, 贡献为: m 2 w \dfrac{m-2}{w'}

\dots

总贡献为: m 1 w + m 2 w + + w w \dfrac{m-1}{w'}+\dfrac{m-2}{w'}+\dots+\dfrac{w}{w}

这里都是作向下取整运算。

即答案的形式肯定是: 1 , 1 , , 2 , 2 , 2 , 3 , 3 1,1,\dots,2,2,2\dots,3,3\dots .

我们令: x = m 1 w x=\dfrac{m-1}{w'} ,我们只需找到 x x 有多少个,剩下的 x 1 , x 2 , 3 , 2 , 1 x-1,x-2\dots,3,2,1 都是 w w' 个。

y = m 1 w ( m o d w ) + 1 y=\dfrac{m-1}{w'}\pmod w+1 ,即为 x x 的个数。

然后答案就是: y × x + ( x 1 ) x 2 × w y\times x+\dfrac{(x-1)x}{2}\times w'

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e3+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
#define mst(a) memset(a,0,sizeof a)
#define lx x<<1
#define rx x<<1|1
#define reg register
#define PII pair<int,int>
#define fi first
#define se second
#define pb push_back
ll gcd(ll a,ll b){
	return b==0?a:gcd(b,a%b);
}
int main(){
	int t;
	scanf("%d",&t);
	while(t--){
		ll n,d,w;
		scanf("%lld%lld%lld",&n,&d,&w);
		w/=gcd(d-1,w);
		ll m=min(n,d)-1;
		ll x=m/w,y=m%w+1;
		printf("%lld\n",y*x+(x-1)*x/2*w);
	} 
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_45750972/article/details/107690913