2019暑假多校训练第三场 | 部分题解

出题人告诉我们 

板子hin重要~~

题解链接: https://pan.baidu.com/s/18CNsiQDXgYcEur0QJKZ-xg 提取码: hv93 复制这段内容后打开百度网盘手机App,操作更方便哦

我们只写了一个题06……

知道07是原题但是没改(出题人验题人好不严谨emmmm 一直改题面)

 

06 Fansblog

HDU 6608 威尔逊定理 + 逆元

其实我们并不知道威尔逊定理 

只是在找规律的时候在oeis发现了威尔逊定理的变形emmmm

#include <iostream>
#include <cstdio>
#include <cstring>
#include <bits/stdc++.h>
using namespace std;
const int S=8;
long long mult_mod(long long a,long long b,long long c)
{
    a%=c;
    b%=c;
    long long ret=0;
    long long tmp=a;
    while(b)
    {
        if(b&1)
        {
            ret+=tmp;
            if(ret>c) ret-=c;
        }
        tmp<<=1;
        if(tmp>c) tmp-=c;
        b>>=1;
    }
    return ret;
}
long long pow_mod(long long a,long long n,long long mod)
{
    long long ret=1;
    long long temp=a%mod;
    while(n)
    {
        if(n&1) ret=mult_mod(ret,temp,mod);
        temp=mult_mod(temp,temp,mod);
        n>>=1;
    }
    return ret;
}
bool check(long long a,long long n,long long x,long long t)
{
    long long ret=pow_mod(a,x,n);
    long long last=ret;
    for(int i=1;i<=t;i++)
    {
        ret=mult_mod(ret,ret,n);
        if(ret==1&&last!=1&&last!=n-1) return true;
        last=ret;
    }
    if(ret!=1) return true;
    else return false;
}
bool Miller_Rabin(long long n)
{
    if(n<2) return false;
    if(n==2) return true;
    if((n&1)==0) return false;
    long long x=n-1;
    long long t=0;
    while((x&1)==0)
    {
        x>>=1;
        t++;
    }
    srand(time(NULL));
    for(int i=0;i<S;i++)
    {
        long long a=rand()%(n-1)+1;
        if(check(a,n,x,t))
            return false;
    }
    return true;
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        long long n,i=1;
        scanf("%lld",&n);
        while(!Miller_Rabin(n-i))
        {
            i++;
        }
        long long sum=1;
        for(long long j=n-i+1;j<=n-2;j++)
            sum=mult_mod(sum,j,n)%n;
        //逆元
        long long p=pow_mod(sum,n-2,n);
        printf("%lld\n",1*p%n);
    }
    return 0;
}

 

07 Find the answer

HDU 6609 线段树

原题链接:https://codeforces.com/contest/1185/problem/C2

多校的题目里数据变大了 要稍微改动一下

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值