//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相邻)
*/