/*20141122 hanting*/
#include <iostream>
#include <sstream>
#include <cmath>
using namespace std;
int main()
{
string s;
while(getline(cin,s) && s!="0")
{
stringstream sin(s);
int sum=1;
int _pow;
int num;
while(sin>>num>>_pow) sum*=pow(num,_pow);
sum--;
bool Num[50000]={0};
int prime[10000];
int x=0;
for(int i=2;i<50000;i++)
{
if(Num[i]==0)
{
prime[x++]=i;
for(int j=i*2;j<50000;j+=i)
{
Num[j]=1;
}
}
}
int ans[1000];
int q=0;
for(int i=0;sum!=1;i++)
{
while(sum%prime[i]==0)
{
ans[q++]=prime[i];
sum/=prime[i];
}
}
for(int i=q-1;i>=0;i--)
{
int pow=1;
if(i!=q-1) cout<<" ";
cout<<ans[i];
while(i-1>=0 && ans[i-1]==ans[i])
{
pow++;
i--;
}
cout<<" "<<pow;
}
cout<<endl;
}
}
2014年11月21日 星期五
[UVA] 516 - Prime Land
2014年11月11日 星期二
[UVA] 11879 - Multiple of 17
/*20141111 hanting*/
#include <iostream>
using namespace std;
int seventeen[105]={0};
inline bool compare(int *seventeen,int *num)
{
for(int i=104;i>=0;i--)
{
if(num[i]>seventeen[i]) return 0;
else if(num[i]<seventeen[i]) return 1;
}
return 1;
}
bool IsSeventeen(int* num,int p)
{
if(compare(seventeen,num))
{
if((num[0]==7 && num[1]==1)||p==0) return 1;
else return 0;
}
else
{
int d=num[0];
d*=5;
for(int i=0;i<p-1;i++)//shift ( remove the last number )
{
num[i]=num[i+1];
}
num[p-1]=0;
p--;
int sub_5d[105]={d};
for(int i=1;i<2;i++)//carry
{
sub_5d[i]+=sub_5d[i-1]/10;
sub_5d[i-1]%=10;
}
/*num-5d*/
int siz=max(p,2);
for(int i=0;i<siz;i++)
{
num[i]-=sub_5d[i];
}
for(int i=0;i<siz;i++)
{
if(num[i]<0)
{
num[i]+=10;
num[i+1]--;
}
}
if(num[siz]<0)//if( num < 5d )
{
num[siz]=0;
for(int i=0;i<siz;i++)//complement
{
num[i]=9-num[i];
}
num[0]++;
for(int i=1;i<siz;i++)//carry
{
num[i]+=num[i-1]/10;
num[i-1]%=10;
}
}
for(int i=104;i>=0;i--)
{
if(num[i]!=0)
{
p=i+1;
break;
}
else if(i==0) p=0;
}
return IsSeventeen(num,p);
}
}
int main()
{
seventeen[0]=7;
seventeen[1]=1;
string s;
while(cin>>s && s!="0")
{
int num[105]={0};
int p=0;
for(int i=s.size()-1;i>=0;i--)
{
num[p++]=s[i]-48;
}
cout<<IsSeventeen(num,p)<<endl;
}
return 0;
}
2014年11月8日 星期六
[UVA] 10140 - Prime Distance
/*20141108 hanting*/
#include <iostream>
#include <cmath>
#include <sstream>
using namespace std;
bool Num[100000];
int prime[10000];
int x=0;
bool isprime(unsigned int num)
{
if(num<100000) return Num[num]==0 ? 1:0;
int s=sqrt(num);//另存s//在for迴圈會慢
for(int i=0;prime[i]<=s;i++)
{
if(num%prime[i]==0) return 0;
}
return 1;
}
int main()
{
for(unsigned int i=2;i<100000;i++) Num[i]=0;
Num[1]=1;
for(unsigned int i=2;i<100000;i++)
{
if(!Num[i])
{
prime[x++]=i;
for(unsigned int j=i*2;j<100000;j+=i)
{
Num[j]=1;
}
}
}
unsigned int L,U;
string s;
while(getline(cin,s))
{
stringstream sin(s);
sin>>L>>U;
unsigned int l,u;
for(l=L;!isprime(l);l++);
L=l;
for(u=U;!isprime(u);u--);
U=u;
if(L>=U) cout<<"There are no adjacent primes."<<endl;
else
{
int clos1=L,clos2=L,dis1=L,dis2=L;
int temp1=L,temp2=L;
int mini=U-L+1,maxi=0;
unsigned int i;
if(L==2) i=L+1;
else i=L+2;
for( i;i<=U;i+=2)
{//質數一定是6n+1或6n-1,所以+2+4+2+4判斷增加效率
if(isprime(i))
{
temp1=temp2;
temp2=i;
if(temp2-temp1<mini)
{
clos1=temp1;
clos2=temp2;
mini=clos2-clos1;
}
if(temp2-temp1>maxi)
{
dis1=temp1;
dis2=temp2;
maxi=dis2-dis1;
}
}
if((i-1)%6==0) i+=2;//+4
}
cout<<clos1<<","<<clos2<<" are closest, "<<dis1<<","<<dis2<<" are most distant."<<endl;
}
}
return 0;
}
2014年11月6日 星期四
[UVA] 369 - Combinations
/*20141107 hanting*/
#include <iostream>
using namespace std;
int prime[30];
int factor[100]={0};
int x=0;
void part1(int num)
{
for(int i=0;num!=1;i++)
{
while(num%prime[i]==0)
{
factor[prime[i]]++;
num/=prime[i];
}
}
}
void part2(int num)
{
for(int i=0;num!=1;i++)
{
while(num%prime[i]==0)
{
factor[prime[i]]--;
num/=prime[i];
}
}
}
void mul(int* ans,int n)
{
for(int i=0;i<100;i++)
{
ans[i]*=n;
}
for(int i=1;i<100;i++)
{
ans[i]+=ans[i-1]/10;
ans[i-1]%=10;
}
}
void output(int *ans)
{
int i;
for(i=99;i>=0;i--)
{
if(ans[i]!=0) break;
}
for(int j=i;j>=0;j--)
{
cout<<ans[j];
}
}
int main()
{
int Num[100]={0};
for(int i=2;i<100;i++)
{
if(Num[i]==0)
{
prime[x++]=i;
for(int j=i;j<100;j+=i) Num[j]=1;
}
}
int n,m;
while(cin>>n>>m && n+m)
{
for(int i=0;i<100;i++) factor[i]=0;
cout<<n<<" things taken "<<m<<" at a time is ";
int ans[100]={1};
if(m>n/2) m=n-m;;
for(int i=2;i<=m;i++)
{
part2(i);
}
for(int i=n;m--;i--)
{
part1(i);
}
for(int i=2;i<98;i++)
{
while(factor[i]--)
{
mul(ans,i);
}
}
output(ans);
cout<<" exactly."<<endl;
}
return 0;
}
================================================
# /* 題目: UVa 369 - Combinations
# * onlinejudge.org/external/3/369.pdf
# * Language: Python
# * Created on: 2019年12月19日
# * Author: hanting
# */
def C(a, b):
if a-b < b :
b = a-b
result = 1
w = 1
for i in range(a-b+1, a+1):
result *= i
result //= w
w += 1
return result
while(True):
x, y = map(int, input().split())
if [x, y] == [0, 0]:
break
print('{} things taken {} at a time is {} exactly.'.format(x, y, C(x, y)))
2014年11月2日 星期日
[UVA] 10303 - How Many Trees ?
/*20141102 hanting*/
/*因為WA不知道錯哪,所以另外又寫了一個版本,
後來發現存大數用10000會溢位,1000就AC了*/
/*遞迴+重載運算*/
#include <iostream>
#include <vector>
using namespace std;
struct BigNum
{
vector<int> num;
void operator+=(BigNum n)
{
int R=max(n.num.size(),num.size());
num.resize(R+1);
n.num.resize(R+1);
vector<int> ans(1);
for(int i=0;i<R;i++)
{
ans[i]+=num[i]+n.num[i];
ans.push_back(ans[i]/1000);
ans[i]%=1000;
}
if(!ans[R]) ans.pop_back();
num=ans;
}
BigNum operator*(BigNum n)
{
BigNum ans;
ans.num.resize(num.size()+n.num.size());
for(int i=0;i<num.size();i++)
{
for(int j=0;j<n.num.size();j++)
{
ans.num[i+j]+=num[i]*n.num[j];
}
}
for(int i=1;i<ans.num.size();i++)
{
ans.num[i]+=ans.num[i-1]/1000;
ans.num[i-1]%=1000;
}
for(int i=ans.num.size()-1;i>0;i--)
{
if(ans.num[i]==0) ans.num.pop_back();
else break;
}
return ans;
}
void operator*=(int n)
{
vector<int> ans(1);
for(int i=0;i<num.size();i++)
{
ans[i]+=num[i]*2;
ans.push_back(ans[i]/1000);
ans[i]%=1000;
}
if(!ans[ans.size()-1]) ans.pop_back();
num=ans;
}
friend ostream& operator<<(ostream& out, BigNum& n)
{
int first=n.num.size()-1;
out<<n.num[first];
for(int i=first-1;i>=0;i--)
{
if(n.num[i]<100) out<<0;
if(n.num[i]<10) out<<0;
out<<n.num[i];
}
return out;
}
};
BigNum store[1005];
BigNum tree(int n)
{
if(store[n].num.size()) return store[n];
else
{
for(int i=0;i<n/2;i++)
{
store[n]+=tree(i)*tree(n-i-1);
}
store[n]*=2;
if(n%2==1)store[n]+=tree(n/2)*tree(n/2);
return store[n];
}
}
int main()
{
store[0].num.push_back(1);
store[1].num.push_back(1);
store[2].num.push_back(2);
store[3].num.push_back(5);
int N;
while(cin>>N)
{
tree(N);
cout<<store[N]<<endl;
}
return 0;
}
/*vector+函數*/
#include <iostream>
#include <vector>
using namespace std;
vector<int> add(vector<int>,vector<int>);
vector<int> mul(vector<int>,vector<int>);
void output(vector<int>);
int main()
{
int N;
vector<int> num[1005];
num[0].push_back(1);
num[1].push_back(1);
num[2].push_back(2);
int MAX=2;
while(cin>>N)
{
if(N<=MAX) output(num[N]);
else
{
for(++MAX;MAX<=N;MAX++)
{
for(int i=0;i<MAX/2;i++)
{
num[MAX]=add(num[MAX],mul(num[i],num[MAX-1-i]));
}
num[MAX]=mul(num[MAX],num[2]);
if(MAX%2)
{
num[MAX]=add(num[MAX],mul(num[MAX/2],num[MAX/2]));
}
}
output(num[--MAX]);
}
}
return 0;
}
vector<int> mul(vector<int> a,vector<int> b)
{
vector<int> Result(a.size()+b.size());
for(int i=0;i<a.size();i++)
{
for(int j=0;j<b.size();j++)
{
Result[i+j]+=a[i]*b[j];
}
}
for(int i=1;i<Result.size();i++)
{
Result[i]+=Result[i-1]/1000;
Result[i-1]%=1000;
}
for(int i=Result.size()-1;i>=0;i--)
{
if(!Result[i]) Result.pop_back();
else break;
}
return Result;
}
vector<int> add(vector<int> a,vector<int> b)
{
vector<int> Result;
int Resize=max(a.size(),b.size());
a.resize(Resize);
b.resize(Resize);
for(int i=0;i<a.size();i++)
{
Result.push_back(a[i]+b[i]);
}
Result.push_back(0);
for(int i=1;i<Result.size();i++)
{
Result[i]+=Result[i-1]/1000;
Result[i-1]%=1000;
}
if(!Result[Result.size()-1]) Result.pop_back();
return Result;
}
void output(vector<int> N)
{
for(int i=N.size()-1;i>=0;i--)
{
if(i!=N.size()-1&&N[i]<100) cout<<"0";
if(i!=N.size()-1&&N[i]<10) cout<<"0";
cout<<N[i];
}
cout<<endl;
}
2014年10月23日 星期四
[UVA] 623 - 500!
/*20141023 hanting*/
#include <iostream>
#include <vector>
using namespace std;
vector<int> stage(int);
vector<int> mul(vector<int>,vector<int>);
int main()
{
int n;
while(cin>>n)
{
cout<<n<<"!"<<endl;
if(!n)
{
cout<<1<<endl;
continue;
}
vector<int> output=stage(n);
for(int i=output.size()-1;i>=0;i--)
{
if(output[i]<10 && i!=output.size()-1) cout<<"00";
else if(output[i]<100 && i!=output.size()-1) cout<<"0";
cout<<output[i];
}cout<<endl;
}
return 0;
}
vector<int> stage(int num)
{
vector<int> return_num;
int Num=num;
while(num)
{
return_num.push_back(num%1000);
num/=1000;
}
if(Num==1)
{
return return_num;
}
else
{
return mul(return_num,stage(Num-1));
}
}
vector<int> mul(vector<int> num1,vector<int> num2)
{
vector<int> result(num1.size()+num2.size(),0);
for(int i=0;i<num1.size();i++)
{
for(int j=0;j<num2.size();j++)
{
result[i+j]+=num1[i]*num2[j];
}
}
for(int i=1;i<result.size();i++)
{
result[i]+=result[i-1]/1000;
result[i-1]%=1000;
}
for(int i=result.size()-1;i>=0;i--)
{
if(!result[i]) result.pop_back();
else break;
}
return result;
}
----------
/* 20151027
* hanting
* UVa 623 - 500!
* C++
*/
#include <iostream>
#include <iomanip> // setw, setfill
using namespace std;
const int maxn = 700;//每一格存4位數
class BigInteger
{
private:
int val[maxn];
int digit;
public:
BigInteger():val{0},digit(0){}
friend ostream& operator << (ostream &out, BigInteger B);
BigInteger operator * (int n);
void operator = (int n);
};
BigInteger fact[1005];
int main()
{
fact[0] = 1;
fact[1] = 1;
for(int i = 2; i < 1005; i++)
{
fact[i] = fact[i-1] * i;
}
int num;
while(cin >> num)
{
cout << num << "!" << endl << fact[num] << endl;
}
return 0;
}
ostream& operator << (ostream &out, BigInteger B)
{
out << B.val[B.digit-1] ;
for(int i = B.digit - 2; i >= 0; i-- )
{
out << setw(4) << setfill('0') << B.val[i];
}
return out;
}
BigInteger BigInteger::operator * (int n)
{
BigInteger result;
for(int i = 0; i < digit; i++)
{
result.val[i] += val[i] * n;
result.val[i+1] += result.val[i] / 10000;
result.val[i] %= 10000;
}
result.digit = this ->digit + 10;
while(!result.val[result.digit-1]) result.digit--;
return result;
}
void BigInteger::operator = (int n)
{
while(n)
{
val[digit++] = n%10000;
n /= 10000;
}
}
2014年9月16日 星期二
[UVA] 120 - Stacks of Flapjacks
/*20140917 hanting*/
#include <iostream>
#include <sstream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
string s;
while(getline(cin,s))
{
stringstream sin(s);
vector<int> a;
int num;
while(sin>>num)
a.push_back(num);
int flip[a.size()];
for(int i=0;i<a.size();i++)
{
if(i!=0) cout<<" ";
cout<<a[i];
flip[i]=a.size()-i;
}
cout<<endl;
int test_sort=1;
int largest;
for(int i=a.size()-1;i>=0 && test_sort;i--)
{
test_sort=0;
largest=i;
for(int j=0;j<i;j++)//find the largest number
{
if(a[j]>a[largest])
{
largest=j;
}
}
if(largest!=i)
{
if(largest!=0)//take it to the first
{
cout<<flip[largest]<<" ";
reverse(a.begin(),a.begin()+largest+1);
}
cout<<flip[i]<<" ";
reverse(a.begin(),a.begin()+i+1);//and then reverse to i
}
for(int j=0;j<a.size()-1;j++)
{
if(a[j]>a[j+1])
{
test_sort=1;
break;
}
}
}
cout<<0<<endl;
}
return 0;
}
2014年9月12日 星期五
[UVA] 10037 - Bridge
/*20140912 hanting*/
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
int N;
cin>>N;
int blankline=0;
while(N--)
{
if(blankline) cout<<endl;
int people;
cin>>people;
int temp=people;
vector<int> a(people);
for(int i=0;i<people;i++)
{
cin>>a[i];
}
sort(a.begin(),a.end());
int A,B,C,D;
A=0;//first
B=1;//second
C=people-2;//last second
D=people-1;//last
int sum=0;
while(people)//consider_sum
{
if(people==1)
{
sum+=a[A];
people--;
}
else if(people==2)
{
sum+=a[B];
people-=2;
}
else if(people==3)
{
sum+=a[B]+a[A]+a[D];
people-=3;
}
else
{
if(a[B]-a[A]>a[C]-a[B])
{
sum+=a[C]+a[A]+a[D]+a[A];
}
else
{
sum+=a[B]+a[A]+a[D]+a[B];
}
people-=2;
C=people-2;
D=people-1;
}
}
cout<<sum<<endl;
people=temp;
A=0;//first
B=1;//second
C=people-2;//last second
D=people-1;//last
while(people)//cout_tread
{
if(people==1)
{
cout<<a[A]<<endl;
people--;
}
else if(people==2)
{
cout<<a[A]<<" "<<a[B]<<endl;
people-=2;
}
else if(people==3)
{
cout<<a[A]<<" "<<a[B]<<endl;
cout<<a[A]<<endl;
cout<<a[A]<<" "<<a[D]<<endl;
people-=3;
}
else
{
if(a[B]-a[A]>a[C]-a[B])
{
cout<<a[A]<<" "<<a[C]<<endl;
cout<<a[A]<<endl;
cout<<a[A]<<" "<<a[D]<<endl;
cout<<a[A]<<endl;
}
else
{
cout<<a[A]<<" "<<a[B]<<endl;
cout<<a[A]<<endl;
cout<<a[C]<<" "<<a[D]<<endl;
cout<<a[B]<<endl;
}
people-=2;
C=people-2;
D=people-1;
}
}
blankline=1;
}
return 0;
}
------------------------------
/* 20151030
* hanting
* UVa 10037 - Bridge
* C++
*/
#include <iostream>
#include <vector>
#include <algorithm> //sort
using namespace std;
int solve(int *num, int n);//return sum
vector<pair<int,int> > Go;
vector<int> Back;
int main()
{
int testCase;
cin >> testCase;
while(testCase--)
{
Go.clear();
Back.clear();
int numN;
cin >> numN;
int num[numN];
for(int i = 0; i < numN; i++)
{
cin >> num[i];
}
if(numN == 1)
{
cout << num[0] << endl;
cout << num[0] << endl;
}
else
{
sort(num, num+numN);
int sum = solve(num, numN);
cout << sum << endl;
cout << Go[0].first << " " << Go[0].second << endl;
for(int i = 1; i < Go.size(); i++)
{
cout << Back[i-1] << endl;
cout << Go[i].first << " " << Go[i].second << endl;
}
}
if(testCase) cout << endl;
}
return 0;
}
int solve(int *num, int n)
{
int sum = 0;
int i;
for(i = n-1; i > 2; i-=2)
{
int method1 = num[i] + num[0] + num[i-1] + num[0];
int method2 = num[1] + num[0] + num[i] + num[1];
if(method1 < method2)
{
Go.push_back(pair<int,int>(num[0],num[i]));
Back.push_back(num[0]);
Go.push_back(pair<int,int>(num[0],num[i-1]));
Back.push_back(num[0]);
sum += method1;
}
else
{
Go.push_back(pair<int,int>(num[0],num[1]));
Back.push_back(num[0]);
Go.push_back(pair<int,int>(num[i-1],num[i]));
Back.push_back(num[1]);
sum += method2;
}
}
if(i == 1)
{
Go.push_back(pair<int,int>(num[0],num[1]));
sum += num[1];
}
else
{
Go.push_back(pair<int,int>(num[0],num[1]));
Back.push_back(num[0]);
Go.push_back(pair<int,int>(num[0],num[2]));
sum += num[1] + num[0] + num[2];
}
return sum;
}
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
int N;
cin>>N;
int blankline=0;
while(N--)
{
if(blankline) cout<<endl;
int people;
cin>>people;
int temp=people;
vector<int> a(people);
for(int i=0;i<people;i++)
{
cin>>a[i];
}
sort(a.begin(),a.end());
int A,B,C,D;
A=0;//first
B=1;//second
C=people-2;//last second
D=people-1;//last
int sum=0;
while(people)//consider_sum
{
if(people==1)
{
sum+=a[A];
people--;
}
else if(people==2)
{
sum+=a[B];
people-=2;
}
else if(people==3)
{
sum+=a[B]+a[A]+a[D];
people-=3;
}
else
{
if(a[B]-a[A]>a[C]-a[B])
{
sum+=a[C]+a[A]+a[D]+a[A];
}
else
{
sum+=a[B]+a[A]+a[D]+a[B];
}
people-=2;
C=people-2;
D=people-1;
}
}
cout<<sum<<endl;
people=temp;
A=0;//first
B=1;//second
C=people-2;//last second
D=people-1;//last
while(people)//cout_tread
{
if(people==1)
{
cout<<a[A]<<endl;
people--;
}
else if(people==2)
{
cout<<a[A]<<" "<<a[B]<<endl;
people-=2;
}
else if(people==3)
{
cout<<a[A]<<" "<<a[B]<<endl;
cout<<a[A]<<endl;
cout<<a[A]<<" "<<a[D]<<endl;
people-=3;
}
else
{
if(a[B]-a[A]>a[C]-a[B])
{
cout<<a[A]<<" "<<a[C]<<endl;
cout<<a[A]<<endl;
cout<<a[A]<<" "<<a[D]<<endl;
cout<<a[A]<<endl;
}
else
{
cout<<a[A]<<" "<<a[B]<<endl;
cout<<a[A]<<endl;
cout<<a[C]<<" "<<a[D]<<endl;
cout<<a[B]<<endl;
}
people-=2;
C=people-2;
D=people-1;
}
}
blankline=1;
}
return 0;
}
------------------------------
/* 20151030
* hanting
* UVa 10037 - Bridge
* C++
*/
#include <iostream>
#include <vector>
#include <algorithm> //sort
using namespace std;
int solve(int *num, int n);//return sum
vector<pair<int,int> > Go;
vector<int> Back;
int main()
{
int testCase;
cin >> testCase;
while(testCase--)
{
Go.clear();
Back.clear();
int numN;
cin >> numN;
int num[numN];
for(int i = 0; i < numN; i++)
{
cin >> num[i];
}
if(numN == 1)
{
cout << num[0] << endl;
cout << num[0] << endl;
}
else
{
sort(num, num+numN);
int sum = solve(num, numN);
cout << sum << endl;
cout << Go[0].first << " " << Go[0].second << endl;
for(int i = 1; i < Go.size(); i++)
{
cout << Back[i-1] << endl;
cout << Go[i].first << " " << Go[i].second << endl;
}
}
if(testCase) cout << endl;
}
return 0;
}
int solve(int *num, int n)
{
int sum = 0;
int i;
for(i = n-1; i > 2; i-=2)
{
int method1 = num[i] + num[0] + num[i-1] + num[0];
int method2 = num[1] + num[0] + num[i] + num[1];
if(method1 < method2)
{
Go.push_back(pair<int,int>(num[0],num[i]));
Back.push_back(num[0]);
Go.push_back(pair<int,int>(num[0],num[i-1]));
Back.push_back(num[0]);
sum += method1;
}
else
{
Go.push_back(pair<int,int>(num[0],num[1]));
Back.push_back(num[0]);
Go.push_back(pair<int,int>(num[i-1],num[i]));
Back.push_back(num[1]);
sum += method2;
}
}
if(i == 1)
{
Go.push_back(pair<int,int>(num[0],num[1]));
sum += num[1];
}
else
{
Go.push_back(pair<int,int>(num[0],num[1]));
Back.push_back(num[0]);
Go.push_back(pair<int,int>(num[0],num[2]));
sum += num[1] + num[0] + num[2];
}
return sum;
}
2014年8月26日 星期二
[UVA] 353 - Pesky Palindromes
/*20140826 hanting*/
#include <iostream>
using namespace std;
string temp;
inline string intrstr(string s,int start,int End)
{
int temp=End-start+1;
return s.substr(start,End-start+1);
}
int palindrome(string s,int left,int right)
{
int sum=0;
while(1)
{
if(s[left]==s[right] && left>=0 && right<s.size())
{
if(temp.find(s.substr(left,right-left+1))>temp.size())
{
temp+=s.substr(left,right-left+1);
temp+=" ";
sum++;
}
left--;
right++;
}
else return sum;
}
}
int main()
{
string s;
while(getline(cin,s))
{
temp.clear();
int ans=0;
for(int i=0;i<s.size();i++)
{
ans+=palindrome(s,i,i);
if(s[i]==s[i+1])ans+=palindrome(s,i,i+1);
}
cout<<"The string '"<<s<<"' contains "<<ans<<" palindromes."<<endl;
}
return 0;
}
2014年8月13日 星期三
[UVA] 355 - The Bases Are Loaded
/*20140813 hanting*/
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cmath>
using namespace std;
string h="0123456789ABCDEF";
string itoa(long long N,int base)
{
char s[1000];
int a[1000];
int i=0;
while(N>=base)
{
a[i++]=N%base;
N/=base;
}
a[i]=N;
for(int j=0;j<=i;j++)
{
s[j]=h[a[i-j]];
}
s[++i]=0;
string str=s;
return str;
}
long long strtoDec(char* N,int base)
{
long long a=0;
for(int i=0;i<strlen(N);i++)
{
int temp=h.find(N[strlen(N)-1-i]);
a+=temp*pow((double)base,i);
}
return a;
}
int main()
{
int base1,base2;
char N[1000];
while(cin>>base1>>base2>>N)
{
int Continue=0;
for(int i=0;i<strlen(N);i++)
{
if(h.find(N[i])>=base1)
{
Continue=1;
cout<<N<<" is an illegal base "<<base1<<" number"<<endl;
break;
}
}
if(Continue) continue;
long long int N_in_Base10;
N_in_Base10=strtoDec(N,base1);///strtol只能用int範圍
cout<<N<<" base "<<base1<<" = "<<itoa(N_in_Base10,base2)<<" base "<<base2<<endl;
}
return 0;
}
2014年8月12日 星期二
[UVA] 389 - Basically Speaking
/*20140812 hanting*/
#include <iostream>
#include <cstdlib>
#include<cstring>
#include <vector>
#include <iomanip>
using namespace std;
void itoa(int base,int a,char *s)
{
vector<int> temp;
char hex[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
while(a>=base)
{
temp.push_back(a%base);
a/=base;
}
temp.push_back(a);
int Size=temp.size();
for(int i=0;i<Size;i++)
{
s[i]=hex[temp.back()];
temp.pop_back();
}
s[Size]=0;
}
int main()
{
char s[100];
while(cin>>s)
{
int fromBase,toBase;
cin>>fromBase>>toBase;
int from;
from=strtol(s,NULL,fromBase);
itoa(toBase,from,s);
if(strlen(s)<=7)
cout<<setw(7)<<s<<endl;
else
cout<<setw(7)<<"ERROR"<<endl;
}
return 0;
}
2014年8月6日 星期三
[UVA] 482 - Permutation Arrays
/*20140807 hanting*/
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int N;
int blank=0;
cin>>N;
while(N--)
{
if(blank) cout<<endl;
vector<int> a;
do
{
int temp;
cin>>temp;
a.push_back(temp);
}while(cin.get()!='\n');
vector<string> b;
do
{
string temp;
cin>>temp;
b.push_back(temp);
}while(cin.get()!='\n');
vector<string> ans(a.size());
for(int i=0;i<a.size();i++)
{
ans[a[i]-1]=b[i];
}
for(int i=0;i<a.size();i++)
{
cout<<ans[i]<<endl;
}
blank=1;
}
return 0;
}
[UVA] 11204 - Musical instruments
/*20140806 hanting*/
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int N;
cin>>N;
while(N--)
{
int m,n;
cin>>m>>n;
vector<int> a(m);
for(int i=0;i<n;i++)
{
int temp;
for(int j=0;j<m;j++)
{
cin>>temp;
if(temp==1) a[j]++;
}
}
int ans=1;
for(int i=0;i<m;i++)
{
if(a[i])ans*=a[i];
}
cout<<ans<<endl;
}
return 0;
}
2014年7月29日 星期二
[UVA] 627 - The Net
/*20140729 hanting*/
#include <iostream>
#include <sstream>
using namespace std;
void run(int a[][1000],int,int);
int router_num;
int main()
{
while(cin>>router_num)
{
cout<<"-----"<<endl;
int Net[router_num+2][1000];
for(int i=0;i<router_num+2;i++)
for(int j=0;j<router_num+2;j++)
Net[i][j]=0;
int ID,temp;
char c;
for(int i=0;i<router_num;i++)
{
cin>>ID;
string s;
getline(cin,s);
if(s.size()==1) continue;
istringstream sin(s);
char c;
while(sin>>c)
{
sin>>temp;
Net[ID][temp]=1;
}
}
int connect_num;
cin>>connect_num;
int starting,ending;
for(int i=0;i<connect_num;i++)
{
cin>>starting>>ending;
run(Net,starting,ending);
}
}
return 0;
}
void run(int a[][1000],int starting,int ending)
{
int tempa[router_num+2][router_num+2];
for(int i=0;i<router_num+2;i++)
for(int j=0;j<router_num+2;j++)
tempa[i][j]=a[i][j];
int b[100][1000]={starting};
int m,n=1;
int i;
for(i=1;i>=0;i++)
{
m=n;
n=0;
for(int j=0;j<m;j++)
{
int ID=b[i-1][j];
for(int k=1;k<=router_num;k++)
{
if(tempa[ID][k])
{
b[i][n++]=k;
if(k==ending)
{
m=0;
break;
}
tempa[ID][k]=0;
}
}
}
if(!n)
{
cout<<"connection impossible"<<endl;
return;
}
if(!m) break;
}
int temp=ending;
int route[1000]={temp};
int con=0;
for(int j=i-1;j>=0;j--)
{
for(int k=0;k>=0;k++)
{
int ID=b[j][k];
if(a[ID][temp])
{
temp=ID;
route[con++]=temp;
break;
}
}
}
for(int i=con-1;i>=0;i--)
{
cout<<route[i]<<" ";
}
cout<<ending<<endl;
}
2014年7月28日 星期一
[UVA] 1225 - Digit Counting
/*20140728 hanting*/
#include <iostream>
using namespace std;
void count(int *a,int i)
{
while(i)
{
a[i%10]++;
i/=10;
}
}
int main()
{
int N;
cin>>N;
while(N--)
{
int n;
cin>>n;
int a[10]={0};
for(int i=1;i<=n;i++)
{
count(a,i);
}
for(int i=0;i<10;i++)
{
cout<<a[i]<<(i!=9 ? ' ':'\n');
}
}
return 0;
}
2014年7月27日 星期日
[UVA] 11687 - Digits
/*20140728 hanting*/
#include <iostream>
#include <sstream>
using namespace std;
int dcount(long long int a)
{
int temp=0;
if(!a) return 1;
while(a)
{
a/=10;
temp++;
}
return temp;
}
int main()
{
string s;
long long int a;
while(cin>>s && s!="END")
{
stringstream ss;
ss<<s;
ss>>a;
int x1=a,x2=dcount(a);
int con=0;
while(x1!=x2)
{
x1=x2;
x2=dcount(x2);
con++;
}
cout<<++con<<endl;
}
return 0;
}
[UVA] 825 - Walking on the Safe Side
/*20140727 hanting*/
#include <iostream>
#include <cstring>
#include <sstream>
using namespace std;
int main()
{
int N;
cin>>N;
int blankline=0;
while(N--)
{
if(blankline) cout<<endl;
int w,e;
cin>>w>>e;
int a[500][500]={1};
int temp,temp2;
for(int i=0;i<w;i++)
{
cin>>temp;
string s;
getline(cin,s);
istringstream sin(s);
while(sin>>temp2)
{
a[temp-1][temp2-1]=-1;
}
}
for(int i=0;i<w;i++)
{
for(int j=0;j<e;j++)
{
if(a[i][j]==-1) continue;
if(a[i-1][j]!=-1 && i)
{
a[i][j]+=a[i-1][j];
}
if(a[i+1][j]!=-1)
{
a[i][j]+=a[i+1][j];
}
if(a[i][j-1]!=-1 && j)
{
a[i][j]+=a[i][j-1];
}
if(a[i][j+1]!=-1)
{
a[i][j]+=a[i][j+1];
}
}
}
cout<<a[w-1][e-1]<<endl;
blankline=1;
}
return 0;
}
2014年7月24日 星期四
[UVA] 294 - Divisors
/*20140725 hanting*/
#include <iostream>
using namespace std;
int prime[10000];
int div(int N)
{
int DivSum=1;
for(int i=0;N!=1;i++)
{
int x=0;
if(prime[i]==0)
{
return DivSum*2;
}
while(N%prime[i]==0)
{
x++;
N/=prime[i];
}
DivSum*=x+1;
}
return DivSum;
}
int main()
{
int Num[50000]={0};
int x=0;
for(int i=2;i<50000;i++)
{
if(Num[i]==0)
{
prime[x++]=i;
for(int j=i;j<50000;j+=i)
{
Num[j]=1;
}
}
}
int N;
cin>>N;
while(N--)
{
int m,n;
int num;
int MaxDiv=0;
cin>>m>>n;
for(int i=m;i<=n;i++)
{
int Div=div(i);
if(Div>MaxDiv)
{
MaxDiv=Div;
num=i;
}
}
cout<<"Between "<<m<<" and "<<n<<", "<<num<<" has a maximum of "<<MaxDiv<<" divisors."<<endl;
}
return 0;
}
2014年7月23日 星期三
[UVA] 10465 - Homer Simpson
/*20140723 hanting*/
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int m,n,t;
while(cin>>m>>n>>t)
{
if(m>n) swap(m,n);
if(t<m)/*it's possible that Homer can't eat anything*/
{
cout<<0<<" "<<t<<endl;
continue;
}
vector<int> a(11000);
for(int j=0;j<11000;j+=n)
{
for(int i=j;i<11000;i+=m)
{
if(a[i]==0)a[i]=(i-j)/m+j/n;
}
}
if(a[t])cout<<a[t]<<endl;
else
{
for(int i=0;i<t;i++)
{
if(a[t-i])
{
cout<<a[t-i]<<" "<<i<<endl;
break;
}
}
}
}
return 0;
}
2014年7月22日 星期二
[UVA] 10189 - Minesweeper
/*20140722 hanting*/
#include <iostream>
using namespace std;
int main()
{
int n,m;
int times=0;
while(cin>>n>>m ,n+m)
{
char c[200][200]={0};
int a[200][200]={0};
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
cin>>c[i][j];
if(c[i][j]=='*')
{
for(int x=0;x<3;x++)
{
for(int y=0;y<3;y++)
{
a[i-1+x][j-1+y]++;
}
}
}
}
}
if(times!=0) cout<<endl;
cout<<"Field #"<<++times<<":"<<endl;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(c[i][j]=='*') cout<<'*';
else cout<<a[i][j];
}
cout<<endl;
}
}
return 0;
}
2014年7月20日 星期日
[UVA] 11185 - Ternary
/*20140721 hanting*/
#include <iostream>
#include <cstdlib>
#include <algorithm>
using namespace std;
void Itoa(int N,char *s,int ary);
int main()
{
int N;
char s[25];
while(cin>>s && s[0]!='-')
{
char ans[25];
for(int i=0;i<25;i++) ans[i]='-';
N=atoi(s);
Itoa(N,ans,3);
cout<<ans<<endl;
}
return 0;
}
void Itoa(int N,char *ans,int ary)
{
int i=0;
for(i=0;i<25;i++)
{
ans[i]=(N%ary)+48;
N/=ary;
if(N==0) break;
}
reverse(ans,ans+i+1);
ans[i+1]=0;
}
2014年7月19日 星期六
[UVA] 10473 - Simple Base Conversion
/*20140720 hanting*/
#include <iostream>
#include <iomanip>
#include <sstream>
using namespace std;
int main()
{
string s;
while(getline(cin,s) && s[0]!='-')
{
stringstream ss;
long long int a;
if(s[1]=='x')
{
ss<<s;
ss>>hex>>a;
cout<<dec<<a<<endl;
}
else
{
ss<<s;
ss>>a;
cout<<"0x"<<hex<<uppercase<<a<<endl;
}
}
return 0;
}
2014年6月7日 星期六
[UVA] 160 - Factors and Factorials
/*20140608 hanting*/
#include<iostream>
#include <iomanip>
using namespace std;
int main()
{
int prime[10000];
int num[50000]={0};
int x=0;
for(int i=2;i<50000;i++)
{
if(num[i]==0)
{
prime[x++]=i;
for(int j=i+i;j<50000;j+=i)
{
num[j]=1;
}
}
}
long long N;
while(cin>>N && N)
{
cout<<setw(3)<<N<<"! =";
int arr[101]={0};/*arr[2]=3 代表 質數2是3次方*/
while(N!=1)/*從N開始一直到1*/
{
int tempN=N;
/*質因數分解*/
for(int i=0;i<100;i++)
{
while(tempN%prime[i]==0)
{
arr[ prime[i] ]++;
tempN/=prime[i];
}
}
N--;
}
int temp;
for(int i=99;i>=0;i--)
{
if(arr[i]!=0)
{
temp=i;
break;
}
}
int con=0;
for(int i=2;i<=temp;i++)
{
if(num[i]==0)
{
cout<<setw(3)<<arr[i];
con++;
if(i==temp)
{
cout<<endl;
break;
}
if(con==15)
{
cout<<endl;
for(int i=0;i<6;i++) cout<<" ";
con=0;
}
}
}
}
return 0;
}
2014年5月23日 星期五
[UVA] 562 - Dividing coins
/*20140523 hanting*/
#include <iostream>
#include <cstdlib>
using namespace std;
int store[1000000]={0};
int main()
{
int N;
cin>>N;
while(N--)
{
int m;
cin>>m;
int a[m];
int sum=0;
int board[50001]={1};
for(int i=0;i<m;i++)
{
cin>>a[i];
sum+=a[i];
}
int x=1;
int mini=sum;
for(int i=0;i<m;i++)
{
int store_size=x;
for(int j=0;j<store_size;j++)
{
int temp=a[i]+store[j];
if(board[temp]==0)
{
board[temp]=1;
store[x]=temp;
mini=min(mini,abs(temp-(sum-temp)));
x++;
}
}
}
cout<<mini<<endl;
}
return 0;
}
2014年5月22日 星期四
[UVA] 11150 - Cola
/*20140522 hanting*/
#include <iostream>
using namespace std;
int main()
{
int N;
while(cin>>N)
{
cout<<N+N/2<<endl;
}
return 0;
}
2014年5月13日 星期二
[UVA] 10252 - Common Permutation
/*20140513 hanting*/
#include <iostream>
using namespace std;
int main()
{
string s1,s2;
while(getline(cin,s1))
{
int a[26]={0};
int b[26]={0};
for(int i=0;i<s1.size();i++)
{
a[(int)s1[i]-97]++;
}
getline(cin,s2);
for(int i=0;i<s2.size();i++)
{
b[(int)s2[i]-97]++;
}
for(int i=0;i<26;i++)
{
for(int j=0;j<a[i] && j<b[i];j++)
cout<<(char)(i+97);
}
cout<<endl;
}
return 0;
}
[UVA] 10050 - Hartals
/*20140513 hanting*/
#include <iostream>
using namespace std;
int main()
{
int N;
cin>>N;
while(N--)
{
int D;
cin>>D;//天數
bool Days[10000]={0};
int P;
cin>>P;//政黨數
int Party[P];
for(int i=0;i<P;i++)
{
cin>>Party[i];
}
for(int i=0;i<P;i++)
{
for(int j=Party[i]-1;j<D;j+=Party[i])
{
Days[j]=1;
}
}
int count=0;
for(int i=0;i<D;i++)
{
if(i%7!=5 && i%7!=6 &&Days[i]==1)
{
count ++ ;
}
}
cout<<count<<endl;
}
return 0;
}
2014年5月1日 星期四
[UVA] 12241 - Digits Count
題目連結
/*20140501 hanting*/
#include <iostream>
using namespace std;
void p(int num,int a[])
{
int ten=1;
int temp=num;
while(num)
{
for(int i=0;i<num%10;i++)
{
a[i]+=ten;
}
for(int i=0;i<10;i++)
{
a[i]+=ten*(num/10);
}
a[0]-=ten;
a[num%10]+=(temp%ten)+1;
ten*=10;
num/=10;
}
}
int main()
{
int a,b;
while(cin>>a>>b && a+b)
{
int Num[10]={0};
p(a-1,Num); /*計算0到a的0~9個有幾個*/
for(int i=0;i<10;i++) Num[i]*=-1; /* 所求= 0~b - 0~(a-1) */
p(b,Num); /*計算0到b的0~9個有幾個*/
for(int i=0;i<10;i++)
{
cout<<Num[i]<<(i==9 ? '\n': ' ');
}
}
return 0;
}
================================
================================
心血來潮又來寫一次重新推出自己的公式
又一個rank 1 超夢是最強的神奇寶貝
/* 題目: UVa 12241 - Digits Count
* Language: C++
* Created on: 2016年8月1日
* Author: hanting
*/
#include <iostream>
#include <cstdio>
using namespace std;
void digitCount(int *digit, int n)
{
int tmp = n;
int base = 1;
while(tmp)
{
if(n >= base)
digit[0] -= base;
digit[tmp%10] += n%base + 1;
int t = tmp%10;
for(int i = 0; i < t; i++)
digit[i] += base;
tmp /= 10;
for(int i = 0; i < 10; i++)
{
digit[i] += tmp*base;
}
base *= 10;
}
}
int main()
{
int a, b;
while(scanf("%d%d", &a, &b) == 2 and a+b)
{
int digit[10] = {0};
int digit2[10] = {0};
digitCount(digit, a-1);
digitCount(digit2, b);
for(int i = 0; i < 9; i++)
{
//cout << digit[i] << " ";
printf("%d ", digit2[i]-digit[i]);
}
//cout << digit[9] << endl;
printf("%d\n", digit2[9]-digit[9]);
}
return 0;
}
2014年4月23日 星期三
[UVA] 10642 - Can You Solve It?
/*20140423 hanting*/
#include <iostream>
using namespace std;
int main()
{
int N;
cin>>N;
for(int times=1;times<=N;times++)
{
int x[2],y[2];
for(int i=0;i<2;i++) cin>>x[i]>>y[i];
int t1=0,t2=0;
for(int i=1;i<=x[0]+y[0];i++)
{
t1+=i;
}
t1+=x[0];
for(int i=1;i<=x[1]+y[1];i++)
{
t2+=i;
}
t2+=x[1];
int ans=t2-t1;
cout<<"Case "<<times<<": "<<ans<<endl;
}
return 0;
}
2014年4月19日 星期六
[UVA] 10908 - Largest Square
/*20140419 hanting*/
#include <iostream>
using namespace std;
int main()
{
int t,m,n,q;
cin>>t;
while(t--)
{
cin>>m>>n>>q;
char ch[102][102]={'\0'};//初始
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
cin>>ch[i][j];
}
}
cout<<m<<" "<<n<<" "<<q<<endl;
while(q--)
{
int r=0,c=0;
cin>>r>>c;
char center=ch[r][c];
int ans=1;
for(int k=3;k>=0;k+=2)//邊長
{
for(int i=0;i<k;i++)//從中心左上角開始跑k*k個字元
{
for(int j=0;j<k;j++)
{
if(ch[r-((k-1)/2)+i][c-((k-1)/2)+j]!=center)
{
i=k;
ans=k-2;k=-3;
break;
}
}
}
}
cout<<ans<<endl;
}
}
return 0;
}
[UVA] 10170 - The Hotel with Infinite Rooms
/*20140419 hanting*/
#include <iostream>
using namespace std;
int main()
{
long long s,d;
while(cin>>s>>d)
{
long long i;
long long sum=0;
for(i=s;sum+i<d;i++)
{
sum+=i;
}
cout<<i<<endl;
}
return 0;
}
2014年3月24日 星期一
[UVA] 11689 - Soda Surpler
/*20140325 hanting*/
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int N;
cin>>N;
while(N--)
{
int e,f,c;
cin>>e>>f>>c;
e+=f;
int ans=0;
while(e/c)
{
ans+=e/c;
e=e/c+e%c;
}
cout<<ans<<endl;
}
return 0;
}
[UVA] 11192 - Group Reverse
/*20140325 hanting*/
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int N;
while(cin>>N && N!=0)
{
string s;
string ans="";
cin>>s;
for(int i=0;i<s.size();i+=(s.size()/N))
{
string ss=s.substr(i,(s.size()/N));
reverse(ss.begin(),ss.end());
ans+=ss;
}
cout<<ans<<endl;
}
return 0;
}
[UVA] 10042 - Smith numbers
/*20140325 hanting*/
#include <iostream>
#include <cmath>
using namespace std;
int m=0;
int Prime[10000];
int num_total(int num)
{
int total=0;
while(num)
{
total+=num%10;
num/=10;
}
return total;
}
bool prime(int num)
{
for(int i=0;i<m && Prime[i]<=ceil(sqrt(num));i++)
{
if(num%Prime[i]==0 && num!=2)
{
return 0;
break;
}
if(Prime[i+1]>ceil(sqrt(num)))
{
return 1;
break;
}
}
}
int SmithNumber_total(int num)
{
int total=0;
for(int i=0;i<m && i<=num;i++)
{
while(num%Prime[i]==0)
{
total+=num_total(Prime[i]);
num/=Prime[i];
}
if(prime(num)==1)
{
total+=num_total(num);
break;
}
}
return total;
}
int main()
{
int Num[50000]={0};
for(int i=2;i<50000;i++)
{
if(Num[i]==0)
{
Prime[m++]=i;
}
for(int j=i;j<50000;j+=i)
{
Num[j]=1;
}
}
int N;
cin>>N;
while(N--)
{
int num;
cin>>num;
while(++num)
{
if(prime(num)!=1)
{
if(SmithNumber_total(num)==num_total(num))
{
cout<<num<<endl;
break;
}
}
}
}
return 0;
}
訂閱:
文章 (Atom)