出题人告诉我们
板子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
多校的题目里数据变大了 要稍微改动一下