题意:
定义一年为 m m m 个月,每个月 d d d 天 ,每周有 w w w 天。
找到有多少对 ( x , y ) (x,y) (x,y) 满足 x x x 月的第 y y y 天 和 y y y 月的第 x x x 天是同一星期。
题解:
题目就是求 ( ( x − 1 ) ⋅ d + y ) % m = = ( ( y − 1 ) ⋅ d + x ) % m ((x-1) \cdot d + y ) \% m == ((y-1) \cdot d + x ) \% m ((x−1)⋅d+y)%m==((y−1)⋅d+x)%m
移项化简可得到: ( d − 1 ) ⋅ ( x − y ) % m = = 0 (d-1) \cdot (x-y) \% m==0 (d−1)⋅(x−y)%m==0 , ( x > y ) (x>y) (x>y)
设 w = m / g c d ( d − 1 , m ) w= m/gcd(d-1,m) w=m/gcd(d−1,m) ,那么 ( x − y ) (x-y) (x−y) 必须是 w w w 的倍数才能使得上述式子满足。
因为 x , y x,y x,y 交换后,要保证有有这个月和这一天,所以直接取 m = m i n ( m , d ) m=min(m,d) m=min(m,d).
那么当 x = m x=m x=m时,有 ( m − 1 ) / w (m-1)/w (m−1)/w 个 , x = m − 1 x=m-1 x=m−1时,有 ( m − 2 ) / w (m-2)/w (m−2)/w 个。。。。以此类推
即求 ∑ i = 1 m − 1 i / w \sum\limits_{i=1}^{m-1} i/w i=1∑m−1i/w , 设 a = m − 1 / w a=m-1/w a=m−1/w ,只要求 a a a 有多少个,那么 剩下 a − 1 a − 2 a − 3....1 a-1 \quad a-2 \quad a-3 ....1 a−1a−2a−3....1 都是 w w w 个。
那么答案就是 a ⋅ ( ( m − 1 ) % w + 1 ) + ( a − 1 ) ⋅ a / 2 ⋅ w a \cdot ((m-1) \% w+1) + (a-1) \cdot a/2 \cdot w a⋅((m−1)%w+1)+(a−1)⋅a/2⋅w
代码:
#pragma GCC diagnostic error "-std=c++11"
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<map>
#include<stack>
#include<set>
#include<ctime>
#define iss ios::sync_with_stdio(false)
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
typedef pair<int,int> pii;
const int mod=1e9+7;
const int MAXN=2e5+5;
const int inf=0x3f3f3f3f;
int main()
{
int t;
cin>>t;
while(t--)
{
ll m,d,w;
cin>>m>>d>>w;
if(d==1)
{
printf("0\n");
continue;
}
ll gd=__gcd(d-1,w);
ll res=w/gd;
ll maxx=min(m,d);
ll ans=0;
ll x=(maxx-1)/res;
ll y=(maxx-1)%res+1;
ans=x*y;
if(x-1>1) ans+=(x-1)*x/2*res;
else if(x-1==1) ans+=(x-1)*res;
printf("%lld\n",ans);
}
}