Southwest University of Science and Technology 질문 E 트윈 프라임 (조사 포인트 : 오일러 체, 곱셈 역 요소, 고속 전력 또는 확장 오일러)
머리말
방금 아침에 팬시 어의 곱셈의 역수를 봤는데, 오후 질문은 우연히 테스트를 받았지만 여전히 멈춰서 쓰지 않았습니다. 요약 템플릿 + 템플릿 질문, 오일러 체 템플릿, 곱셈 역 요소 템플릿, 빠른 파워 템플릿. 이력서 엔지니어가되는 것은 AC가 될 수 있지만 불행히도 그럴 자격이 없습니다. 저는 wawawa였습니다.
게임 전에 열심히 일하지 말고 게임 중에 와우 와우.
주제 설명
주제 링크 : link .
두 가지 문제 해결 아이디어
1. 오일러 체 (쌍둥이 소수 m의 수 찾기)
2. 곱셈 역 요소 (분수를 직접 변조 할 수 없으므로 분수 m / n mod 1e9 + 7의 값을 찾는 데 마지막으로 사용됨)
곱셈 역 요소 공식은 다음과 같습니다. 주어졌습니다.
3 개의 빠른 거듭 제곱 (위 Q의 mod-2 전력 문제를 해결하는 데 사용됨).
? ? ? 지나간? ? ? 이거 없어졌어?
사라진 것 같지만 한 문장이 남았는데 n 개 중 2 개가 쌍 소수 일 확률은 어떻게 계산할까요?
아무도 몰라요 우연히도 몰라요
세 가지 문제 해결 코드
#include<bits/stdc++.h>
using namespace std;
const int maxx = 1e7+10;
int prime[maxx+10];//筛素数的数组
int a[maxx+10];//n个数中有几个孪生素数
bool vis[maxx+10];//标记数组,0是i对应是素数,1是非素。
const int mod=1e9+7;//要模的值
typedef long long ll;
void init() //欧拉筛+判断n中有几个孪生素数的打表。
{
vis[0]=vis[1]=1;
int k=0;
for(int i=2;i<=maxx;i++){
if(vis[i]==0)prime[++k]=i;
for(int j=1;i*prime[j]<=maxx;j++){
vis[i*prime[j]]=1;
if(i%prime[j]==0)break;
}
}
for (ll i = 0; i <= 10000000; ++i) {
a[i] = a[i - 1];
if (!vis[i] && !vis[i - 2]) {
++a[i];
}
}
}
ll ksm(ll a ,ll k) //快速幂
{
ll rec=1;
while(k)
{
if (k&1)
rec=((rec%mod)*(a%mod))%mod;
a=((a%mod)*(a%mod))%mod;
k>>=1;
}
return rec%mod;
}
int main()
{
ll n;
int t;
cin>>t;
init();
while(t--)
{
cin>>n;
//cout<<bj[n]<<" ";
cout<<(a[n])*ksm(n*(n-1)/2,mod-2)%mod<<endl;//我们从1∼N中不放回地抽取两个数,抽到的是孪生素数的概率.
}
return 0;
}
네 가지 요약
숫자 이론 플레이어로서 저는 개인적으로 자주 사용되는 템플릿이 마음에 분명하다고 생각합니다. 템플릿은 대회에서 사용할 수 있지만 타이핑하는 데 능숙한 것이 좋습니다. 결국 이력서 엔지니어는 그다지 좋지 않습니다.
매일 다섯 가지 격려
모든 노력이 여전히 강하다면 남동쪽에서 북서쪽으로 바람을 피우십시오.