ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

E. Calendar Ambiguity

2021-10-23 12:33:07  阅读:157  来源: 互联网

标签:ch const int ll cfrac Ambiguity Calendar define


E. Calendar Ambiguity

链接

题目大意

给定\(m,d,w\),表示一年中有\(m\)个月,每个月有\(d\)天,一周有\(w\)天,现在求出\((x,y)\)的对数,其满足:
\(x < y\)并且\(x\)月\(y\)日和\(y\)月\(x\)日是一周中的同一天。

解题思路

显然是要求这个式子:

\[[(i - 1) * d + j] - [(j - 1) * d + i] = 0 (mod\ w) \]

即: \((d-1)(i- j) = 0 (mod\ w)\),(i > j)
因为\(d,w\)已知,所以求出\(g = gcd(d - 1, w), d - 1 = k_1 * g, w = k_2 * g\)
则此时有: \(k_1 * g * (i - j) = k * k_2 * g => (i - j) = \cfrac{k}{k_1} * \cfrac{w}{g}\),因为\((i-j),\cfrac{w}{g}\)是整数,所以\(\cfrac{k}{k_1}\)也是整数,所以\((i - j)\)是\(\cfrac{w}{g}\)的倍数。
取\(w' = \cfrac{w}{g}\)
因此我们可以想到枚举 \(i\):

  • \(i = m\),这时\(1 \leq j \leq m -1\),\(1 \leq (i-j) \leq m-1\),所以贡献为\(\cfrac{m-1}{w'}\)
  • \(\cdots\)
    因此答案为\(\cfrac{m-1}{w'} + \cfrac{m-2}{w'} + \cdots + \cfrac{1}{w}\),
    因为是向下取整所以不可以合并计算。
    我们发现这个答案一定是\(1 + 1 + \cdots + k\),
    并且根据除法的性质可以知道除了最后一个\(k\),所有的数都出现了\(w'\)次,而最后一个数出现了\((m - 1)\ \%\ w' + 1\)次,令\(x = \cfrac{m - 1}{w'}\)
    则答案就是\(x * ((m - 1)\ \%\ w + 1) + w' * ((x - 1) * x\ /\ 2)\)。

Code

#include <bits/stdc++.h>
#define ll long long
#define qc ios::sync_with_stdio(false); cin.tie(0);cout.tie(0)
#define fi first
#define se second
#define PII pair<int, int>
#define PLL pair<ll, ll>
#define pb push_back
#define V vector
using namespace std;
const int N = 2e5 + 7;
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const ll mod = 1e9 + 7;
inline int read()
{
    int x=0,f=1;char ch=getchar();
    while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}
    while (isdigit(ch)){x=x*10+ch-48;ch=getchar();}
    return x*f;
}

ll m,d,w;
ll gcd(ll x,ll y)
{
    return y ? gcd(y, x % y) : x;
}
void solve(){
    scanf("%lld%lld%lld",&m,&d,&w);
    ll g = gcd(d - 1, w);
    m = min(m, d);
    ll w1 = w / g;
    ll p = (m - 1) / w1;
    ll ans = ((m - 1) % w1 + 1) * p + w1 * ((p - 1) * p / 2);
    printf("%lld\n",ans);
}

int main()
{
#ifdef ONLINE_JUDGE
#else
    freopen("in.txt", "r", stdin);
    freopen("out.txt", "w", stdout);
#endif

    int T = 1;
    scanf("%d",&T);
    while(T--){
        solve();
    }
    return 0;
}

标签:ch,const,int,ll,cfrac,Ambiguity,Calendar,define
来源: https://www.cnblogs.com/KeepInCode/p/15442882.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有