UVA数学入门训练Round1[6]

UVA - 11388

GCD LCM

题意:输入g和l,找到a和b,gcd(a,b)=g,lacm(a,b)=l,a<b且a最小



g不能整除l时无解,否则一定g,l最小

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
inline int read(){
    char c=getchar();int x=0,f=1;
    while(c<‘0‘||c>‘9‘){if(c==‘-‘)f=-1;c=getchar();}
    while(c>=‘0‘&&c<=‘9‘){x=x*10+c-‘0‘;c=getchar();}
    return x*f;
}
int T,g,l;
int main(int argc, const char * argv[]){
    T=read();
    while(T--){
        g=read();l=read();
        if(l%g) printf("-1\n");
        else printf("%d %d\n",g,l);
    }
    return 0;
}

PS:Luogup1029求数量的话可以依据a*b=g*l枚举

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
inline int read(){
    char c=getchar();int x=0,f=1;
    while(c<‘0‘||c>‘9‘){if(c==‘-‘)f=-1;c=getchar();}
    while(c>=‘0‘&&c<=‘9‘){x=x*10+c-‘0‘;c=getchar();}
    return x*f;
}
ll g,l;
int cnt=0;
inline int gcd(int a,int b){
    return b==0?a:gcd(b,a%b);
}
int main(int argc, const char * argv[]) {
    g=read();l=read();
    ll n=g*l;
    for(ll i=g;i<=l;i++){
        if(n%i) continue;
        ll j=n/i;
        if(gcd(i,j)==g) cnt++;
    }
    printf("%d",cnt);
    return 0;
}



UVA - 11889

Benefit

题意:输入A和C,求最小的B使lcm(A,B)=C



用唯一分解定理想

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
inline int read(){
    char c=getchar();int x=0,f=1;
    while(c<‘0‘||c>‘9‘){if(c==‘-‘)f=-1;c=getchar();}
    while(c>=‘0‘&&c<=‘9‘){x=x*10+c-‘0‘;c=getchar();}
    return x*f;
}
int a,l,T;
inline int gcd(int a,int b){return b==0?a:gcd(b,a%b);}
int main(int argc, const char * argv[]) {
    T=read();
    while(T--){
        a=read();l=read();
        if(l%a) printf("NO SOLUTION\n");
        else{
            int b=l/a,g=gcd(a,b),t=1;
            while(g!=1){
                t*=g;
                a/=g;
                g=gcd(a,b);
            }
            printf("%d\n",b*t);
        }
    }
    return 0;
}



UVA - 10943

How do you add?

题意:k个不超过n的非负整数加起来和为n有几种方案



完全背包

f[i][j]表示i个数加起来和为j

转移可以从O(n)变O(1)

可以是f[i-1][j]+0,也可以是f[i][j-1]+1

f[i][j]=(f[i-1][j]+f[i][j-1])%MOD;
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int N=105,MOD=1e6;
inline int read(){
    char c=getchar();int x=0,f=1;
    while(c<‘0‘||c>‘9‘){if(c==‘-‘)f=-1;c=getchar();}
    while(c>=‘0‘&&c<=‘9‘){x=x*10+c-‘0‘;c=getchar();}
    return x*f;
}
int n,m,f[N][N];
void dp(){
    for(int i=0;i<=100;i++) f[i][0]=1;
    for(int i=1;i<=100;i++)
        for(int j=1;j<=100;j++)
            f[i][j]=(f[i-1][j]+f[i][j-1])%MOD;
}
int main(int argc, const char * argv[]) {
    dp();
    while((n=read())){
        m=read();
        printf("%d\n",f[m][n]);
    }

    return 0;
}



UVA - 10791

Minimum Sum LCM

题意:输入n,求至少两个正整数,使lcm=n



唯一分解定理分解后就是最优解,注意素数

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
inline int read(){
    char c=getchar();int x=0,f=1;
    while(c<‘0‘||c>‘9‘){if(c==‘-‘)f=-1;c=getchar();}
    while(c>=‘0‘&&c<=‘9‘){x=x*10+c-‘0‘;c=getchar();}
    return x*f;
}
int n;
ll sol(int n){
    if(n==1) return 2;
    int cnt=0,m=sqrt(n)+1;
    ll ans=0;
    for(int i=2;i<=m&&n!=1;i++) if(n%i==0){
        cnt++;
        ll d=1;
        while(n%i==0) n/=i,d*=i;
        ans+=d;
    }
    if(n>1) cnt++,ans+=n;
    if(cnt==1) return ans+1;
    else return ans;
}
int main(int argc, const char * argv[]) {
    int cas=0;
    while(scanf("%d",&n)!=EOF&&n){
        printf("Case %d: %lld\n",++cas,sol(n));
    }
    return 0;
}



UVA - 10780

Again Prime? No Time.

题意: 输入n和m,求最大的k使m^k整除n!



唯一分解定理裸

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int N=1e4+5;
typedef long long ll;
inline int read(){
    char c=getchar();int x=0,f=1;
    while(c<‘0‘||c>‘9‘){if(c==‘-‘)f=-1;c=getchar();}
    while(c>=‘0‘&&c<=‘9‘){x=x*10+c-‘0‘;c=getchar();}
    return x*f;
}
int T,m,n,e1[N],e2[N],p[N],vis[N],cnt=0;
void era(int n){
    int m=sqrt(n)+1;
    for(int i=2;i<=m;i++) if(!vis[i])
        for(int j=i*i;j<=n;j+=i) vis[j]=1;
    for(int i=2;i<=n;i++) if(!vis[i]) p[++cnt]=i;
}
void divide(int n,int e[]){
    for(int i=1;i<=cnt&&n!=1;i++) if(n%p[i]==0){
        int d=0;
        while(n%p[i]==0) n/=p[i],d++;
        e[i]+=d;
    }
}
int main(int argc, const char * argv[]){
    era(10000);
    T=read();int cas=0;
    while(T--){
        printf("Case %d:\n",++cas);
        memset(e1,0,sizeof(e1));
        memset(e2,0,sizeof(e2));
        m=read();n=read();
        divide(m,e1);
        for(int i=1;i<=n;i++) divide(i,e2);
        int flag=0,k=100000,len=max(m,n);
        for(int i=1;i<=len;i++){//printf("%d  %d %d\n",p[i],e1[i],e2[i]);
            if(e1[i]>e2[i]){flag=1;printf("Impossible to divide\n");break;}
            if(e2[i]!=0&&e1[i]!=0) k=min(k,e2[i]/e1[i]);
        }
        if(!flag) printf("%d\n",k);
    }

    return 0;
}
时间: 2024-10-24 19:31:44

UVA数学入门训练Round1[6]的相关文章

蓝桥杯练习系统--入门训练+基础练习

入门训练 <1>Fibonacci数列 问题描述  Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1. 当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少. 输入格式  输入包含一个整数n. 输出格式  输出一行,包含一个整数,表示Fn除以10007的余数. 说明:在本题中,答案是要求Fn除以10007的余数,因此我们只要能算出这个余数即可,而不需要先计算出Fn的准确值,再将计算的结果除以10007取余数,直接计算余数往往比先算出原数再取

【蓝桥杯】 入门训练 圆的面积

入门训练 圆的面积 时间限制:1.0s   内存限制:256.0MB 问题描述 给定圆的半径r,求圆的面积. 输入格式 输入包含一个整数r,表示圆的半径. 输出格式 输出一行,包含一个实数,四舍五入保留小数点后7位,表示圆的面积. 说明:在本题中,输入是一个整数,但是输出是一个实数. 对于实数输出的问题,请一定看清楚实数输出的要求,比如本题中要求保留小数点后7位,则你的程序必须严格的输出7位小数,输出过多或者过少的小数位数都是不行的,都会被认为错误. 实数输出的问题如果没有特别说明,舍入都是按四

【蓝桥杯】 入门训练 序列求和

入门训练 序列求和 时间限制:1.0s   内存限制:256.0MB 问题描述 求1+2+3+...+n的值. 输入格式 输入包括一个整数n. 输出格式 输出一行,包括一个整数,表示1+2+3+...+n的值. 样例输入 4 样例输出 10 样例输入 100 说明:有一些试题会给出多组样例输入输出以帮助你更好的做题. 一般在提交之前所有这些样例都需要测试通过才行,但这不代表这几组样例数据都正确了你的程序就是完全正确的,潜在的错误可能仍然导致你的得分较低. 样例输出 5050 数据规模与约定 1

uva 674 (入门DP, 14.07.09)

 Coin Change  Suppose there are 5 types of coins: 50-cent, 25-cent, 10-cent, 5-cent, and 1-cent. We want to make changes with these coins for a given amount of money. For example, if we have 11 cents, then we can make changes with one 10-cent coin an

【蓝桥杯】入门训练 Fibonacci数列

入门训练 Fibonacci数列 时间限制:1.0s   内存限制:256.0MB 问题描述 Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1. 当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少. 输入格式 输入包含一个整数n. 输出格式 输出一行,包含一个整数,表示Fn除以10007的余数. 说明:在本题中,答案是要求Fn除以10007的余数,因此我们只要能算出这个余数即可,而不需要先计算出Fn的准确值,再将计算的结果除以10007取余

蓝桥杯-- 入门训练 圆的面积

入门训练 圆的面积 时间限制:1.0s   内存限制:256.0MB 问题描述 给定圆的半径r,求圆的面积. 输入格式 输入包含一个整数r,表示圆的半径. 输出格式 输出一行,包含一个实数,四舍五入保留小数点后7位,表示圆的面积. 说明:在本题中,输入是一个整数,但是输出是一个实数. 对于实数输出的问题,请一定看清楚实数输出的要求,比如本题中要求保留小数点后7位,则你的程序必须严格的输出7位小数,输出过多或者过少的小数位数都是不行的,都会被认为错误. 实数输出的问题如果没有特别说明,舍入都是按四

蓝桥杯-入门训练 序列求和

入门训练 序列求和 时间限制:1.0s   内存限制:256.0MB 问题描述 求1+2+3+...+n的值. 输入格式 输入包括一个整数n. 输出格式 输出一行,包括一个整数,表示1+2+3+...+n的值. 样例输入 4 样例输出 10 样例输入 100 说明:有一些试题会给出多组样例输入输出以帮助你更好的做题. 一般在提交之前所有这些样例都需要测试通过才行,但这不代表这几组样例数据都正确了你的程序就是完全正确的,潜在的错误可能仍然导致你的得分较低. 样例输出 5050 数据规模与约定 1

蓝桥杯 入门训练 Fibonacci数列(Java)

@Author : qingdujun 入门训练 Fibonacci数列  : http://lx.lanqiao.org/problem.page?gpid=T4 import java.util.Scanner; /** * 蓝桥杯: 入门训练 Fibonacci数列 * @author qingdujun * */ public class Main { public static void main(String[] args) { int f1 = 1; int f2 = 1; int

蓝桥杯-入门训练-A+B问题

入门训练 A+B问题 时间限制:1.0s   内存限制:256.0MB 问题描述 输入A.B,输出A+B. 说明:在"问题描述"这部分,会给出试题的意思,以及所要求的目标. 输入格式 输入的第一行包括两个整数,由空格分隔,分别表示A.B. 说明:"输入格式"是描述在测试你的程序时,所给的输入一定满足的格式. 做题时你应该假设所给的输入是一定满足输入格式的要求的,所以你不需要对输入的格式进行检查.多余的格式检查可能会适得其反,使用你的程序错误. 在测试的时候,系统会自