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