NOIP 2017 Day1 T1 小凯的疑惑

luogu题面

小学奥数呵呵

在考场上40分钟没证出来(数学太差),运气好看到了规律...

来一波证明

定义 f(a,b) 表示在 gcd(a,b)==1 情况下的答案。

贝祖定理 易证:对于 gcd(c,b)==1,c > a , 有 f(c,b) = f(a,b) + (c-a)*(b-1)

因为我们已知:f(a,b) == f(b,a) ,且 gcd(a,b) == 1

那么我们不妨令 b 为奇数(两数至少一数为奇数)

那么,f(a,b) == f(2,b) + (a-2)*(b-1)

接下来,同理我们解 f(2,b) = f(b,2) = f(3,2) + (b-3)*(2-1) == f(3,2) + (b-3)

由于我们已知:f(2,3) == 1

所以,f(a,b) = f(2,b) + (a-2)*(b-1) = f(3,2) + (b-3) + (a-2)*(b-1) = 1 + b-3 + (ab-2b-a+2) == ab-b-a

证毕。

代码...没多大意义啊...

#include<bits/stdc++.h>
using namespace std;
int main(){
    long long a,b;  // 不开 LL 会炸掉
    scanf("%lld%lld",&a,&b);
    printf("%lld",a*b-a-b);
    return 0;
}

%%% Dalao 的 ex_gcd

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
ll gcd(ll a, ll b){
    return b == 0 ? a : gcd(b, a % b);
}
void ex_gcd(ll a, ll b, ll &x, ll &y){
    if(b == 0){
        x = 1, y = 0; return;
    }
    ex_gcd(b, a % b, y, x);
    y -= (a / b) * x;
}
ll a, b;
int main(){
    cin >> a >> b;
    if(a > b) swap(a, b);
    ll x, y;
    ex_gcd(a, b, x, y);
    if(x > 0){
        swap(a, b);
        swap(x, y);
    }
    ll tmp = (-x) / b;
    x = x + tmp * b;
    y = y - tmp * a;
    while(x < 0) x = x + b, y = y - a;
    while(x > 0) x = x - b, y = y + a;
    ll ans;
    ll xx2 = x + b;
    ans = a * (xx2 - 1) + b * (y - 1);
    cout << ans - 1 << endl;
    return 0;
}

By  The_Seventh

2017-12-23  19:32:14

时间: 2024-08-30 06:53:35

NOIP 2017 Day1 T1 小凯的疑惑的相关文章

【比赛】NOIP2017 小凯的疑惑

找规律:ans=a*b-a-b 证明:(可见 体系知识) gcd(A, B) = 1 → lcm(A, B) = AB 剩余类,把所有整数划分成m个等价类,每个等价类由相互同余的整数组成 任何数分成m个剩余类,分别为 mk,mk+1,mk+2,……,mk+(m-1) 分别记为{0(mod m)},{1(mod m)}…… 而n的倍数肯定分布在这m个剩余类中 因为gcd(m,n)=1,所以每个剩余类中都有一些数是$n$的倍数,并且是平均分配 设 kmin = min { k | nk ∈ {i (

洛谷 3951 小凯的疑惑

洛谷 3951 小凯的疑惑 题目描述 小凯手中有两种面值的金币,两种面值均为正整数且彼此互素.每种金币小凯都有 无数个.在不找零的情况下,仅凭这两种金币,有些物品他是无法准确支付的.现在小 凯想知道在无法准确支付的物品中,最贵的价值是多少金币?注意:输入数据保证存在 小凯无法准确支付的商品. 输入输出格式 输入格式: 输入数据仅一行,包含两个正整数 aa 和 bb ,它们之间用一个空格隔开,表示小凯手 中金币的面值. 输出格式: 输出文件仅一行,一个正整数 NN ,表示不找零的情况下,小凯用手中

一道数学恶心题——小凯的疑惑

小凯的疑惑 本人的第二篇博客,嗷嗷嗷!二话不说,来挑战下! 神奇传送门: 神奇的思路: 首先看到这道题,我真的无从下手.只能想到暴力枚举.然后...(不堪回首的往日啊)就没有然后了.手推几个数据点,很容易发现每个答案都小于两个质数的积,然后试了下a*b-a-b,...成功了所以代码如下. 神奇的题解 #include<iostream> #include<cstdio> using namespace std; int main() { long long a,b; cin>

洛谷 P3951 小凯的疑惑

问题描述 小凯手中有两种面值的金币,两种面值均为正整数且彼此互素.每种金币小凯都有无数个.在不找零的情况下,仅凭这两种金币,有些物品他是无法准确支付的.现在小凯想知道在无法准确支付的物品中,最贵的价值是多少金币?注意:输入数据保证存在小凯无法准确支付的商品. 输入格式 输入文件名为math.in. 输入数据仅一行,包含两个正整数 a 和 b,它们之间用一个空格隔开,表示小凯手中金币的面值. 输出格式 输出文件名为math.out. 输出文件仅一行,一个正整数 N,表示不找零的情况下,小凯用手中的

NOIP2017 小凯的疑惑

https://www.luogu.org/problemnew/show/P3951 以a=7,b=3 为例 把自然数按一行a个划分 假设现在已有了 ax+by=k   x,y 都是非负整数 假设k在第r行的第h列, 在k的基础上,无论加多少a,新的可以表示的数也一定在第h列 即第h列,自第r行往下的行 所代表的数 都可以用a,b 凑出来 那么我们一个一个的往上加b 0个b: 1个b: 2个b: …… 6个b: 当加到a-1个b时,出现了被完全覆盖的段 原理: 当a,b互质时,{b,2b,3b

P3951 小凯的疑惑

题目描述 小凯手中有两种面值的金币,两种面值均为正整数且彼此互素.每种金币小凯都有 无数个.在不找零的情况下,仅凭这两种金币,有些物品他是无法准确支付的.现在小 凯想知道在无法准确支付的物品中,最贵的价值是多少金币?注意:输入数据保证存在 小凯无法准确支付的商品. 输入输出格式 输入格式: 两个正整数 aa 和 bb,它们之间用一个空格隔开,表示小凯中金币的面值. 输出格式: 一个正整数 NN,表示不找零的情况下,小凯用手中的金币不能准确支付的最贵的物品的价值. 输入输出样例 输入样例#1: 复

洛谷P1328==codevs3716 生活大爆炸版石头剪刀布[NOIP 2014 day1 T1]

P1328 生活大爆炸版石头剪刀布 1.8K通过 2.6K提交 题目提供者2014白永忻 标签模拟NOIp提高组2014 难度普及- 提交该题 讨论 题解 记录 最新讨论 Who can help me(+﹏+)~ hehe 我去 数据错误 题目描述 石头剪刀布是常见的猜拳游戏:石头胜剪刀,剪刀胜布,布胜石头.如果两个人出拳一样,则不分胜负.在<生活大爆炸>第二季第8 集中出现了一种石头剪刀布的升级版游戏. 升级版游戏在传统的石头剪刀布游戏的基础上,增加了两个新手势: 斯波克:<星际迷航

P3951小凯的疑惑

这是2017年提高组的第一题,是一个小学奥数题?听说很多大佬爆零了,我AC了,,, 这个题首先给出两个素数,问取任意个这两个素数之和不可以达到的最大的数是多少?拿到这个题首先很蒙,于是试了试样例,并没有得到什么启发,于是就构思代码,想双层for循环这两个数的个数,但怎样最大呢?然后再次去分析数据.eg.7&3=11,2&5=3,3$4=5.突然间,发现这些值都是a*b-(a+b).但是看数据范围,发现1*10^9-->1*10^18,所以一定要开long long. 1.拿到这种“奥

[NOIp2017提高组]小凯的疑惑

题目大意: 给你两个数a,b,保证a与b互质,求最大的x满足不能被表示成若干个a与b的和. 思路: 据说是小学奥数题. 考场上先写了个a*b的60分DP,然后打表发现答案就是(a-1)*(b-1)-1. 1 #include<cstdio> 2 #include<cctype> 3 typedef long long int64; 4 inline int getint() { 5 register char ch; 6 while(!isdigit(ch=getchar()));