2019 UMS 교육 Day6 문제 풀이 보고서

8543 단어
T1:
링크:https://www.luogu.org/problem/P2520
$sol:$수학적 유도
코드:
#include 
typedef int intt;
#define int long long
using namespace std;
int a, b, x, y, t, d;
int gcd(int a, int b) { return b == 0 ? a : gcd(b, a % b); }
bool check(int x, int y) { return (x % d == 0 && y % d == 0) || ((x + a) % d == 0 && (y + b) % d == 0) || ((x + b) % d == 0 && (y + a) % d == 0) || ((x + a + b) % d == 0 && (y + a + b) % d == 0); }
intt main() {
    cin >> t;
    while(t--) {
        cin >> a >> b >> x >> y;
        d = gcd(a, b) << 1;
        check(x, y) ? (cout << "Y" << endl) : (cout << "N" << endl);
    }
    return 0;
}

T2:
링크:https://www.luogu.org/problem/P4626
$sol$: 오라체는 범위 내의 소수를 처리하고 소수의 최고 차멱으로 표시하면 최종 결과에 도달할 수 있습니다.이 카드 공간 카드는 항상 $bitset$등의 기술을 사용하여 최적화해야 합니다.
코드:
// luogu-judger-enable-o2
#include 
#include 
#include 
const int MAXN = 100000005;
const int mod = 100000007;
typedef long long ll;
using namespace std;
bitset vis;
int n, cnt, prime[10000005];
ll ans = 1;
void get_prime() {
    for(register int i = 2; i <= n; i++) {
        if(!vis[i])
            prime[++cnt] = i;
        for(register int j = 1; i * prime[j] <= n && j <= cnt; j++) {
            vis[i * prime[j]] = 1;
            if(i % prime[j] == 0)
                break;
        }
    }
}
ll calc(int x) {
    ll ans = x;
    while(ans <= n)
        ans = ans * x;
    return ans / x % mod;
}
int main() {
    ios::sync_with_stdio(false);
    cin >> n;
    get_prime();
    for(int i = 1; i <= cnt; i++)
        ans = (ans * calc(prime[i]) % mod) % mod;
    cout << ans % mod << endl;
    return 0;
}

T3:
링크:https://www.luogu.org/problem/P1516
$sol$: 방정식을 풀 수 없습니다. 마지막으로 풀 범위에 주의하십시오.
코드:
#include 
typedef long long ll;
using namespace std;
ll x, y, m, n, l;
ll exgcd(ll a, ll b, ll &x, ll &y) {
    if(b == 0) {
        x = 1;
        y = 0;
        return a;
    }
    ll gcd = exgcd(b, a % b, x, y);
    ll t = x;
    x = y;
    y = t - a / b * y;
    return gcd;
}
int main() {
    cin >> x >> y >> m >> n >> l;
    ll a = n - m, c = x - y;
    if(a < 0) {
        a *= -1;
        c *= -1;
    }
    ll gcd = exgcd(a, l, x, y);
    if(c % gcd != 0) {
        cout << "Impossible" << endl;
        return 0;
    }
    l /= gcd;
    cout << (x * (c / gcd) % l + l) % l << endl;
    return 0;
}

 
전재 대상:https://www.cnblogs.com/BeyondLimits/p/11325083.html

좋은 웹페이지 즐겨찾기