結果
| 問題 |
No.438 Cwwプログラミング入門
|
| コンテスト | |
| ユーザー |
btk
|
| 提出日時 | 2016-10-26 17:59:04 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 2 ms / 2,000 ms |
| コード長 | 2,860 bytes |
| コンパイル時間 | 1,915 ms |
| コンパイル使用メモリ | 168,736 KB |
| 実行使用メモリ | 5,248 KB |
| 最終ジャッジ日時 | 2024-11-27 21:41:26 |
| 合計ジャッジ時間 | 4,418 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 98 |
ソースコード
/*
* Problem link
* http://yukicoder.me/problems/1100
*/
#include<bits/stdc++.h>
using namespace std;
struct cww{cww(){cin.tie(0);ios_base::sync_with_stdio(false);} }star;
typedef long long LL;
// a x + b y = gcd(a, b)
// O(log (a+b) )
LL extgcd(LL a, LL b, LL &x, LL &y) {
LL g = a; x = 1; y = 0;
if (b != 0) g = extgcd(b, a % b, y, x), y -= (a / b) * x;
return g;
}
LL gcd(LL a,LL b){
return (b==0)?a:gcd(b,a%b);
}
LL lcm(LL a,LL b){
return (a*b)/gcd(a,b);
}
inline bool inner(LL x,LL lb,LL ub) {
return(lb <= x && x <= ub);
}
#define SZ 10000
int main() {
LL x, y, z;
cin >> x >> y >> z;
assert(inner(x, 0, 100000000));
assert(inner(y, 0, 100000000));
assert(inner(z, 0, 100000000));
/*多分分けなくてもいいけどz=0は分けたほうが楽だと思います.*/
if (z == 0){
cout << "ccW" << endl;
return 0;
}
/*これは分けないと多分事故る*/
else if (x == 0 && y ==0){
cout << "mourennaihasimasenn" << endl;
return 0;
}
else if (x == 0) {
if (z%y == 0 && (z / y) * 2 - 1 <= SZ) {
for (int i = 0; i < (z / y); i++)cout << 'w';
for (int i = 1; i < (z / y); i++)cout << 'C';
cout << endl;
return 0;
}
}
else if (y == 0) {
if (z%x == 0 && (z / x) * 2 - 1 <= SZ) {
for (int i = 0; i < (z / x); i++)cout << 'c';
for (int i = 1; i < (z / x); i++)cout << 'C';
cout << endl;
return 0;
}
}
else if(z%gcd(x,y)==0){
LL a,b,c,d,g,l,k;
g=extgcd(x,y,a,b);
l=lcm(x,y);
//ax+by=g
k=z/g;
c=l/x;
d=l/y;
//(ak+nc)x+(bk-nd)y=g*k=z
a*=k;b*=k;
//nについて三分探索
//のかわりにbtk法を使用
auto f=[&](LL m){
return abs(a+c*m)+abs(b-d*m);
};
LL n=0,w=1145141919,nx,ny;
LL y=f(n);
while(w>1){
// cout<<w<<" "<<y<<endl;
if ((ny=f(nx=n+w)) < y) y = ny, n = nx;
else if ((ny=f(nx=n-w)) < y) y = ny, n = nx;
w =(w+1)/ 2;
}
LL res=n;
for(int i=-3;i<=3;i++)if(f(res)>f(n+i))res=n+i;
//cout<<a+c*res<<" "<<b-d*res<<endl;
if(f(res)*2-1<=SZ){
a=a+c*res;
b=b-d*res;
char s1='c',s2='w',e1='C',e2='C';
if(a<=0){
swap(s1,s2);
swap(a,b);
}
if(b<0)e2='W';
for(int i=0;i<abs(b);i++)cout<<s2;
for(int i=0;i<a;i++)cout<<s1;
for(int i=1;i<a;i++)cout<<e1;
for(int i=0;i<abs(b);i++)cout<<e2;
cout<<endl;
return 0;
}
}
cout << "mourennaihasimasenn" << endl;
return 0;
}
btk