本文是第一篇学习日志。
下午,去补了下之前的根号算法,看了T2 Chef and Churu 的题解,感觉只能理解70%,先不打算写了,明天在来理解一遍。
去写了下 2009 的 NOIP 真题,T2第一眼甚至不会。。。
贴下T1的代码(很水)
#include<bits/stdc++.h>
//#define int long long
#define debug puts("原始人,启洞!");
using namespace std;
const int N = 1e5 + 10;
map<char, char> mp;
map<char, bool> flag;
char ch1[N], ch2[N], ch3[N];
int tot;
int main() {
// freopen(".in", "r", stdin);
// freopen(".out", "w", stdout);
scanf("%s%s%s", ch1 + 1, ch2 + 1, ch3 + 1);
int len = strlen(ch1 + 1);
// cout << len << endl;
for(int i = 1; i <= len; i++){
if(!mp[ch1[i]] && !flag[ch2[i]]){
mp[ch1[i]] = ch2[i];
flag[ch2[i]] = 1;
tot++;
if(tot >= 26) break;
}else{
cout << "Failed" << endl;
return 0;
}
}
if(tot < 26){
cout << "Failed" << endl;
return 0;
}
len = strlen(ch3 + 1);
for(int i = 1; i <= len; i++){
if(!mp[ch3[i]]){
cout << "Failed" << endl;
return 0;
}
cout << mp[ch3[i]];
}
return 0;
}//by hwl
还有T2的
我推理好一会式子。。。可以退役了。。。
总体思路就是:
x只可能是b1的因子,所以我们可以枚举b1的所有因子。
然后分别判断gcd(x,a0)=a1, lcm(x,b0)=b1是否成立就行了。
但是我们数字非常大直接这么干会TLE,考虑优化。
对于式子gcd(x, a0)=a1和 lcm(x,b0)=b1可推得:
1.gcd(x/a1,a0/a1)=1
2.gcd(b1/x,b1/b0)=1
只需判断以上两个条件就行了。
#include<bits/stdc++.h>
//#define int long long
#define debug puts("原始人,启洞!");
using namespace std;
const int N = 1e5 + 10;
int main() {
// freopen(".in", "r", stdin);
// freopen(".out", "w", stdout);
int n, a0, a1, b0, b1;
cin >> n;
for(int _ = 1; _ <= n; _++){
int ans = 0;
cin >> a0 >> a1 >> b0 >> b1;
for(int i = 1; 1ll * i * i <= b1; i++){
if(b1 % i == 0 && i % a1 == 0){
if(__gcd(i / a1, a0 / a1) == 1 && __gcd(b1 / i, b1 / b0) == 1) ans++;
}
if(i * i != b1 && b1 % i == 0 && (b1 / i) % a1 == 0)
if(__gcd((b1 / i) / a1, a0 / a1) == 1 && __gcd(b1 / (b1 / i), b1 / b0) == 1) ans++;
}
cout << ans << endl;
}
return 0;
}//by hwl