UVA11388 11889 10943 10780 10892 11752 11076 11609 11489 10791 11461/LA 2889 2911 2756 数论基础题

//A UVA 11388 GCD LCM
#include <stdio.h>
#include <string.h>
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int l,g,m,a,b;
        scanf("%d%d",&g,&l);
        if(l%g!=0)
            printf("-1\n");
        else
        {
            printf("%d %d\n",g,l);
        }
    }
    return 0;
}



//B UVA 11889 Benefit
#include <stdio.h>
#include <string.h>
int gcd(int a,int b)
{
    if(!b)return a;
    gcd(b,a%b);
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int a,c,b,d,t,s,g;
        scanf("%d%d",&a,&c);
        if(c%a!=0)
            printf("NO SOLUTION\n");
        else
        {
            d=c/a;
            g=gcd(d,a);
            d=d*g;
            a=a/g;
            while(gcd(g,a)!=1)
            {
                g=gcd(g,a);
                d=d*g;
                a=a/g;
            }
            printf("%d\n",d);
        }
    }
    return 0;
}




//C UVA 10943 How do you add?
#include <stdio.h>
#include <string.h>
#define mod 1000000
int f[101][101];
int main()
{
    int n,k,i,j;
    for(i=1;i<=100;i++)
        f[1][i]=1;
    for(i=2;i<=100;i++)
    {
        for(j=1;j<=100;j++)
        {
            if(j==1)
                f[i][j]=(f[i-1][j]+1)%mod;
            else
                f[i][j]=(f[i-1][j]+f[i][j-1])%mod;
        }
    }
    while(scanf("%d%d",&n,&k)!=EOF)
    {
        if(n==0&&k==0)
            break;
        printf("%d\n",f[k][n]);
    }
    return 0;
}



//D Again Prime?No Time.
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <map>
using namespace std;
#define INF 1000000000
int find(int k,int n)
{
    int i,s=0;
    for(i=k;i<=n;i+=k)
    {
        int t=i;
        while(t%k==0)
        {
            s++;
            t=t/k;
        }
    }
    return s;
}
int main()
{
    int T,tt=0,i,j,k;
    scanf("%d",&T);
    while(T--)
    {
        int m,n,ans=INF,t;
        scanf("%d%d",&m,&n);
        i=2;
        while(m!=1)
        {
            if(m%i==0)
            {
                t=1;
                m=m/i;
                while(m%i==0)
                {
                    m=m/i;
                    t++;
                }
                ans=min(ans,find(i,n)/t);
            }
            i++;
        }
        printf("Case %d:\n",++tt);
        if(ans!=0)
            printf("%d\n",ans);
        else
            printf("Impossible to divide\n");
    }
    return 0;
}




//E UVA 10892 LCM Cardinality
#include <stdio.h>
#include <iostream>
#include <math.h>
#include <string.h>
#include <algorithm>
#include <vector>
using namespace std;
#define maxn 10000
#define LL long long
LL gcd(LL a,LL b)
{
    if(!b)return a;
    gcd(b,a%b);
}
LL c[10001];
int main()
{
    LL n;
    while(cin>>n)
    {
        if(n==0)
            break;
        if(n==1)
        {
            printf("1 1\n");
            continue;
        }
        LL i,j,k,m,t=0,s=0;
        m=(LL)sqrt(n+0.5);
        for(i=2;i<=m;i++)
        {
            if(n%i==0)
            {
                c[t++]=i;
                c[t++]=n/i;
            }
        }
        if(m*m==n)
            t--;
        sort(c,c+t);
        s+=t+2;
        for(i=0;i<t;i++)
        {
            for(j=t-i-1;j<t;j++)
            if(c[j]>=c[i]&&c[i]*c[j]/gcd(c[i],c[j])==n)
            {
                //printf("**%lld %lld\n",c[i],c[j]);
                s++;
            }
        }
        cout<<n<<" "<<s<<endl;
    }
    return 0;
}




//F UVA 11752 The Super Powers
#include <stdio.h>
#include <math.h>
#include <iostream>
#include <algorithm>
using namespace std;
#define LL unsigned long long
#define pos 1e-12
LL c[1<<17];
LL p[1001];
int main()
{
    //freopen("D:\\111.txt","w",stdout);
    LL i,j,k,t=0,s,n;
    for(i=2;i<100;i++)
        for(j=i*i;j<100;j+=i)
        if(p[i]==0)
            p[j]=1;
    cout<<"1"<<endl;
    for(i=2;i<(1<<16);i++)
    {
        n=(LL)64/(log(i)/log(2))-pos;//pow(i,x)<pow(2,64)-->xlog(i)/log(2)<64
        s=i;
        for(j=2;j<=n;j++)
        {
            s=s*i;
            if(p[j]==0)
                continue;
            c[t++]=s;
        }
    }
    sort(c,c+t);
    t=unique(c,c+t)-c;
    for(i=0;i<t;i++)
        cout<<c[i]<<endl;
    //cout<<t<<endl;
    return 0;
}




//G UVA 11076 Add Again
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <iostream>
#include <map>
#include <math.h>
using namespace std;
#define LL unsigned long long
LL c[20],e[1001],f[100];
LL mm[20];
int main()
{
    //freopen("D:\\test.txt","r",stdin);
	//freopen("D:\\1.txt","w",stdout);
    LL i,j,k,n;
    c[0]=c[1]=1;
    for(i=2;i<=15;i++)
        c[i]=c[i-1]*i;
    //cout<<c[12]<<endl;
    while(cin>>n)
    {
        if(n==0)
            break;
        memset(mm,0,sizeof(mm));
        LL s=0,t=0,a,temp,ans;
        for(i=0;i<n;i++)
        {
            cin>>a;
            if(mm[a]==0)
            {
                f[t++]=a;
                mm[a]++;
            }
            else
            {
                mm[a]++;
            }
            s+=a;
        }
        s=s*c[n-1];
        for(i=0;i<t;i++)
        {
            s=s/c[mm[f[i]]];
        }
        for(i=0;i<n;i++)
            e[i]=s;
        temp=0;
        for(i=0;i<n;i++)
        {
            ans=temp+e[i];
            temp=ans/10;
            e[i]=ans%10;
        }
        while(temp)
        {
            e[n++]=temp%10;
            temp/=10;
        }
        while(e[n-1]==0&&n!=1)
            n--;
        for(i=n-1;i;i--)//unsigned long long 的值不能为负,用i>=0,则最后i=-1,错误
        cout<<e[i];
        cout<<e[0];
        cout<<endl;
    }
    return 0;
}




//H UVA 11609 Teams
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
#define mod 1000000007
#define LL long long
LL pows(LL a,LL b)
{
    LL s=1;
    while(b)
    {
        if(b&1)
            s=s*a%mod;
        a=a*a%mod;
        b=b>>1;
    }
    return s;
}
int main()
{
    LL T,tt=0;
    cin>>T;
    while(T--)
    {
        LL n;
        cin>>n;
        cout<<"Case #"<<++tt<<": "<<(pows(2,n-1)*n)%mod<<endl;
    }
    return 0;
}
/*
组合数c,c(n,k)=c(n,n-k)
ans=c(n,1)+2*c(n,2)+3*c(n,3)+4*c(n,4)+...+n*c(n,n)
    =n*c(n,n)+n*c(n,n-1)+n*c(n,n-2)+...+n*c(n,n/2+1)(如果n为偶数,最后加的是n/2*c(n,n/2));
    =n/2*(c(n,n)+c(n,n-1)+...+c(n,0))=n*2^(n-1);
*/




//I UVALive/LA 2889 Palindrome Numbers
#include <stdio.h>
#include <math.h>
#include <iostream>
#include <algorithm>
using namespace std;
#define LL unsigned long long
int main()
{
    LL n;
    while(cin>>n)
    {
        if(n==0)
            break;
        LL t=18,i,j,k,m,s;
        m=n;
        k=1;
        while(m>t)
        {
            m-=t;
            t=t*10;
            k=k+2;
        }
        //printf("%d %d\n",k,t);
        t=t>>1;
        if(m>t)
        {
           m-=t;
           k++;
        }
        j=(k-1)/2;
        s=(LL)pow(10.0,j)+m-1;
        cout<<s;
        i=0;
        while(s)
        {
            if(i==0&&k%2==1)
            {
                s=s/10;
                i++;
                continue;
            }
            i++;
            cout<<s%10;
            s=s/10;
        }
        cout<<endl;
    }
    return 0;
}




//J UVA 11489 Integer Game
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
char a[1001];
int c[11];
int main()
{
    int T,tt=0;
    cin>>T;
    while(T--)
    {
        int i,j,k,t,n,m,s=0;
        cin>>a;
        n=strlen(a);
        memset(c,0,sizeof(c));
        for(i=0;i<n;i++)
        {
            c[a[i]-'0']++;
            s+=a[i]-'0';
        }
        cout<<"Case "<<++tt<<": ";
        s=s%3;
        for(i=1;i<10;i++)
        {
            if(i%3==s&&c[i]!=0)
            {
                c[i]--;
                break;
            }
        }
        if(i>=10)
        {
            cout<<'T'<<endl;
            continue;
        }
        t=0;
        while(c[3]||c[6]||c[9])
        {
            if(c[3])
                c[3]--;
            else if(c[6])
                c[6]--;
            else if(c[9])
                c[9]--;
            else
                break;
            t++;
        }
        if(t%2==0)
            cout<<'S'<<endl;
        else
            cout<<"T"<<endl;
    }
    return 0;
}




//K UVA 10791 Minimum Sun LCM
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <iostream>
using namespace std;
#define LL long long
int main()
{
    LL n,tt=0;
    while(cin>>n)
    {
        if(n==0)
            break;
        LL i,j,k,m,t,s,num;
        t=n;
        m=(LL)sqrt(n+0.5);
        i=2;
        s=num=0;
        while(t!=1)
        {
            if(i>m)
                break;
            if(t%i==0)
            {
                k=1;
                while(t%i==0)
                {
                    t=t/i;
                    k=k*i;
                }
                s+=k;
                num++;
            }
            i++;
        }
        cout<<"Case "<<++tt<<": ";
        if(t==n)//证明n是素数,还有是n=1
            cout<<n+1<<endl;
        else
        {
            if(t!=1)
            {
                num++;
                s+=t;
            }
            if(num==1)//只有一种质因子,如8=2*2*2
                cout<<n+1<<endl;
            else
                cout<<s<<endl;
        }
    }
    return 0;
}
/*
题意:输入n,找到至少两个整数,使得最小公倍数为n。且各个数之和最小
答案就是各个质因子相应次方的和,各个质因子相应次方数之间互质,乘积为n,又尽可能的被分解,所以和最小
注意:
当n为素数的时候,无质因子,因而只有(n,1)最适合
当n是一个素数的多少次方时,质因子相应次方数只有一个,不符合题目要求,还要加上整数1
*/




//L UVA 11461 Square Numbers
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <iostream>
#include <algorithm>
using namespace std;
int e[1001];
int main()
{
    int a,b,t=1,i,j,k;
    for(i=1;i*i<=100000;i++)
    {
        e[t++]=i*i;
    }
    e[t++]=100000;
    while(cin>>a>>b)
    {
        int l,r;
        if(a==0&&b==0)
            break;
        l=lower_bound(e,e+t,a)-e;
        r=upper_bound(e,e+t,b)-e;
        cout<<r-l<<endl;
    }
    return 0;
}





//M UVALive 2911 Maximum
完败
我的思路是贪心,先将b个√a给满,如果b是负的给-1/√a,否则给√a;
其余个x,根据(a+1)分队,每堆由a个-1/√a和一个√a组成。剩余的小于(a+1)的t个
t-1个是-1/√a,一个是(t-1)*√a(如果t不是0的话),这样贪心结束,求和就好了。
我是这么理解的,最后挂了。。谁解了的告诉我下吧。。


//N UVALive/LA 2756 Crazy tea party
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <iostream>
#include <algorithm>
using namespace std;
int f[20001];//f[i]记录一段i长的不循环长度,每次两个左右交换,需要的次数
int main()
{
    int i,j,k,n,T;
    f[1]=0;
    f[2]=1;
    for(i=3;i<20000;i++)
        f[i]=f[i-1]+i-1;
    cin>>T;
    while(T--)
    {
        cin>>n;
        int a,b;
        a=n/2;//每次对半交换,根据要去位置的距离,选择从左走还是从右走
        b=n-n/2;
        cout<<f[a]+f[b]<<endl;
    }
    return 0;
}
/*
题意,输入一个n,表示n个人围成圈,每次交换左右两人,问使所有人的左右交换需要多少次交换。
如1,2,3,4,5,6,要变成6,5,4,3,2,1,(1与6相邻)
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值