大白書—數學基礎—基礎題

*最小公倍數(Benefit,uva10943)

輸入兩個整數A和C(1<=A,C<=10^7),求最小的整數B使得LCM(A,B)=C。如果無解,輸出“NO SOLUTION”。

分析:

lcm(a,b)=a*b/gcd(a,b),爲了避免公共部分被消掉,b需要取滿a未取滿的部分。

初始b=c/a,然後a不斷除以gcd(a,b),b不斷乘以gcd(a,b),直到gcd(a,b)=1.


*lcm的個數(lcm cardinality, uva10892)

輸入正整數n,(n<=2 000 000 000),統計有多少對正整數a<=b,滿足lcm(a,b)=n。比如有8對正整數滿足lcm(a,b)=12,即(1,12)(2,12)(3,12)(4,12)(6,12)(12,12)(3,4)(4,6)。輸出n和滿足條件的整數對數。

注意:約數的個數較少,即使O(n^2)的複雜度也可以很快求解出來。直接枚舉約數,暴力計算個數即可。


**排列之和(add again ,uva11076)

輸入n個數字(1<=n<=12),這些數字的任何一種排列都是一個整數。你的任務是求出所有這些整數之和。比如3個數字2,2,4能組成3個整數224,242,422,他們的和是888.

分析:對於某個數字來說,它出現在每一位的概率相同,只需求出每位上出現的次數,乘以1111~~~111即可。

代碼:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<queue>
#include<stack>
#define MOD 1000000009
using namespace std;
int main()
{
    unsigned long long sum,num,s1,s2;
    int n,a[30],m,i,j;
    while(scanf("%d",&n)&&n)
    {
        sum=0;
        num=1;
        s1=s2=0;
        memset(a,0,sizeof(a));
        for(i=1;i<=n;i++)
        {
            scanf("%d",&m);
            a[m]++;
            num*=i;
            s1=s1*10+1;
        }
        for(i=0;i<10;i++)
        {
            for(j=2;j<=a[i];j++)
                num/=j;
        }
        for(i=0;i<10;i++)
        {
            sum+=i*a[i]*num/n;
        }
        sum*=s1;
        printf("%llu\n",sum);
    }
    return 0;
}




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章