CodeForces 1389 E Calendar Ambiguity
https://codeforc.es/problemset/problem/1389/E
其实就是让你列公式自己算一次,
(x*d - d + y) %w = (y*d - d + x)%w
最后化简成 : (d-1)*(y - x)%w = 0;
可知y-x(y > x)必须是w/gcd (d-1,w)的倍数
可以说是很巧妙了吧。x和y的范围必须是len = min(d,m)
假设f(a)表示y-x=a时y的可选个数,f (a) = len - a
答案就是sigm f(i) for( i = x;i<=len;i+=x);
简化一下
具体看代码就好
#include<iostream>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
const int maxn = 2e5+11;
typedef long long ll;
ll len;
ll f(ll x){
	return len - x;
}
int main(){
	int t;
	cin>>t;
	while(t--){
		ll m,d,w;
		cin>>m>>d>>w;
		
		len = min(m,d);
		
		ll x = __gcd(d-1,w);
		x = w/x;
		
		ll ans = 0;
		ll n = len/x;
		ans = n*len - n*(n+1)*x/2;
		cout<<ans<<endl;
		
	}
	return 0;
}
     寻找真正的热爱

 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号