1. 程式人生 > >基礎數論

基礎數論

感覺寫的好low。。。
輾轉相除法求最大公約數和最小公倍數

int gcd(int a,int b)
{
    if(!b)
    return a;
    else
    return gcd(b,a%b); 
}
int lm(int a,int b)
{
    return a/gcd(a,b)*b; //避免超過int 先除後乘。
}

hdu 1713 戳這裡
這是求最大公約數和最小公倍數的混合運用,其實我的程式碼複雜了。。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <sstream> #include <string> #include <algorithm> #include <list> #include <map> #include <vector> #include <queue> #include <stack> #include <cmath> #include <cstdlib> #include<iomanip> #define MAXN 1000005 using namespace std; #define ll long long int
ll l1,l2,t1,t2,temp1,temp2; int find(string s) { for(int i=0;i<s.length();i++) if(s[i]=='/') return i; } void returnspeed(string s) { ll l=0,t=0; int pos=find(s); int times1=0; int times2=0; for(int j=pos-1;j>=0;j--) { l+=((s[j]-48
)*pow(10,times1)); times1++; } for(int j=s.length()-1;j>pos;j--) { t+=((s[j]-48)*pow(10,times2)); times2++; } temp1=l; temp2=t; //cout<<temp1<<" "<<temp2<<endl; } int gcd(int a,int b) { if(!b) return a; else return gcd(b,a%b); } int lm(int a,int b) { return a/gcd(a,b)*b; } int main() { ios::sync_with_stdio(false); int t; cin>>t; while(t--) { string s1,s2; cin>>s1>>s2; returnspeed(s1); l1=temp1; t1=temp2; returnspeed(s2); l2=temp1; t2=temp2; int t=gcd(l1,t1); l1/=t; t1/=t; t=gcd(l2,t2); l2/=t; t2/=t; if(gcd(t1,t2)==1) cout<<lm(l1,l2)<<endl; else cout<<lm(l1,l2)<<"/"<<gcd(t1,t2)<<endl; //cout<<l2<<" "<<t2<<endl; } }

定理 兩個數的和的mod等於兩個數分別取mod在取mod。
hdu 1021 戳這裡

#include <iostream>
#include <cstdio>
#include <cstring>
#include <sstream>
#include <string>
#include <algorithm>
#include <list>
#include <map>
#include <vector>
#include <queue>
#include <stack>
#include <cmath>
#include <cstdlib>
#include<iomanip>
#define MAXN 1000005
using namespace std;
#define ll long long int
ll fibo[MAXN];
int main()
{   ios::sync_with_stdio(false);
    ll n;
    fibo[0]=7%3;
    fibo[1]=11%3;
    for(int i=2;i<=MAXN;i++)
       {    
               fibo[i]=fibo[i-1]+fibo[i-2];
               fibo[i]%=3;
        } 
    while(cin>>n)
    {    //cout<<fibo[n]%3<<endl;
        if(fibo[n]%3==0)
        cout<<"yes"<<endl;
        else
        cout<<"no"<<endl;
    }
} 

最後一個篩選素數
用法很多可以根據需要進行調整。

memset(a,0,sizeof(a));
for(int i=1;i<=maxn;i++)
    if(!a[i])
    {
        for(int j=2*i;j<=maxn;j+=i)
              a[j]=1;
    }