ホワイトペーパー2.6の研究ノート

2.6研究
2.6.1
GCDは、
ユークリッドアルゴリズムの拡張
非常に明確に具体的な操作手順書を説明し、以下のテンプレートを

int extgcd(int a,int b,int &x,int &y)
{
	int d=a;
	if(b!=0)
	{
		d=extgcd(b,a%b,y,x);
		y-=(a/b)*x;
	}
	else
	{
		x=1,y=0;
	}
	return d;
}

実際の実施例
1ロックウェル谷P1082合同式
A * X≡1(MODB)由来
A * B MOD X. 1 =
A * X + B * Y. 1 =
A * X + Y * B = 1
と基板が直接設定されています覚えては、最小の正の整数である
との* X≡1(MODB)を使用
偉大な詳細に書かれたブログの首長クリック転送を

#include <bits/stdc++.h>
using namespace std;
int extgcd(int a,int b,int &x,int &y)
{
	int d=a;
	if(b!=0)
	{
		d=extgcd(b,a%b,y,x);
		y-=(a/b)*x;
	}
	else
	{
		x=1,y=0;
	}
	return d;
}
int main()
{
	int a,b,x,y;
	cin>>a>>b;
	extgcd(a,b,x,y);
	b=abs(b);
	while(x<0)
	x+=b;
	while(x-b>0)
	x-=b;
	cout<<x<<"\n";
	return 0;
}

2.P1516カエル日付
emmm、収穫は場合AX + BY = C、Xが動作後extgcdにわたって正の最小解である、X =(X *(C知られている / D)%(B / D)+ B / D) %(B / D)
が非常に重要で、それは暗唱に推奨される(
以前の質問が直接この式を使用することができます

#include <bits/stdc++.h>
using namespace std;
int extgcd(long long int a,long long int b,long long int &x,long long int &y)
{
	long long int d=a;
	if(b!=0)
	{
		d=extgcd(b,a%b,y,x);
		y-=(a/b)*x;
	}
	else
	{
		x=1,y=0;
	}
	return d;
}
int main()
{
	long long int x,y,n,m,l;
	cin>>x>>y>>m>>n>>l;
	long long int a=x-y;
	long long int b=n-m;
	if(b<0)
	{
		a=-a;
		b=-b;
	}
	long long int q,w;
	long long int c=extgcd(b,l,q,w);
	if(a%c==0)
	cout<<(q*(a/c)%(l/c)+l/c)%(l/c)<<"\n";
	else
	cout<<"Impossible\n";
	return 0;
}

問題の一部の主要な機能を変更することもできます

	int a,b,x,y;
	cin>>a>>b;
	int c=extgcd(a,b,x,y);
//	b=abs(b);
//	while(x<0)
//	x+=b;
//	while(x-b>0)
//	x-=b;
	cout<<(x*(1/c)%(b/c)+b/c)%(b/c)<<"\n";
	return 0;

基本アルゴリズムの数について2.6.2プライム
シングルプライム処理から直接行くことが

 整数分解 
map <int , int > prime_factor (int n) {
	map <int , int >ans ;
	for(int i = 2; i * i <= n; i ++) {
		while (n % i == 0) {
			++ ans [i];
			n /= i;
		}
	}
	if(n != 1) ans [n] = 1;
	return ans ;
}

素数オングストロームふるいタイプ内のN列挙、O(nloglogn)の複雑

int prime[MAX_N];//第i个素数 
bool is_prime[MAX_N+1];//素数为true
//返回n以内素数的个数
int sieve(int n)
{
	int p=0;
	for(int i=0;i<=n;i++)
	{
		is_prime[i]=true;
	}
	is_prime[0]=is_prime[1]=false;
	for(int i=2;i<=n;i++)
	{
		if(is_prime[i])
		{
			prime[p++]=i;
			for(int j=2*i;j<=n;j+=i)
			{
				is_prime[j]=false;
			}
		}
	}
	return p;
}

間隔は、ふるい
の素数= X <Bを見つけます<

#include <bits/stdc++.h> 
using namespace std;
typedef long long ll;
const int MAXN = 1000000+5;
bool is_prime[MAXN];
bool is_prime_small[MAXN];
void segment(ll a, ll b)
{
	// ------------初始化 --------------
    for(ll i=0; i*i<b; i++)
        is_prime_small[i] = true;
    for(ll i=0; i<b-a; i++)
        is_prime[i]=true;
	// ---------------------------------
	
    for(ll i=2; i*i<b; i++)
    {
        if(is_prime_small[i])
        {
        	// 筛[2,sqrt(b) 
            for(ll j=(ll)2*i; j*j<b; j+=i)
                is_prime_small[j] = false;
                
			// 筛[a,b)
            for(ll j=max((a-1+i)/i,2ll)*i; j<b; j+=i)
                is_prime[j-a] = false;
        }
    }
}
int main()
{
    ll a, b;
    cin >> a >> b;
    segment(a, b);
    ll ans = 0;
    for(ll i=a; i<b; i++)
    {
        if(is_prime[i-a])
            ans++;
    }
    cout << ans << endl;
    return 0;
}

 

高速電力
レベルの方法を繰り返し
Oの複雑さ(LOGN)

1long long fact(long long a,long long b,int c)
{
	long long sum=1%c;
	for(;b;b>>=1)
	{
		if(b&1)
		sum=sum*a%c;
		a=a*a%c;
	}
	return sum;
}
2typedef long long ll;
ll mod_pos(ll x,ll n,ll mod) {//快速幂
    ll res=1;
    while(n>0) {
        if(n&1)res=res*x%mod;//如果2进制最低位为1,则乘上x^(2^i)
        x=x*x%mod;//将x平方
        n>>=1;
    }
    return res;
}
3号
ll mod_pos(ll x,ll n,ll mod)
{
	if(n==0) return 1;
	ll res=mod_pow(x*x%mod,n/2,mod);
	if(n&1) res=res*x%mod;
	return res;
 } 

リリース6元記事 ウォン称賛10 ビュー5671

おすすめ

転載: blog.csdn.net/WWL0702/article/details/104649061