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;
}

  

原文地址:https://www.cnblogs.com/lesning/p/13919601.html