这道题拖得也蛮久的。现在过了,有点感动。
这种题如果你智商180,当场可以YY出结论,如果你做题经验较丰富
猜出结论也不是什么太难的事。
分析下几组数据,看下面3类数列吧
第一类
123123123123123
123451234512345
第二类
1212
1234
第三类
123456123456123456
123456789123456789
发现了什么呢?
很多时候,我们固定一个点,然后就会发现
设上面数列不重复个数为a
下面为b
上面每个点对应了下面的b/gcd(a,b)个点
大悟?这不就是a*b/gcd(a,b)=lcm吗?
然后就是编码,首先容易想到一个O(a*b)
很明显题目要求一个O(n)的。。。具体见代码
/*
author:ray007great
version:1.0
*/
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<vector>
#include<set>
#include<map>
#include<string>
#include<time.h>
#include<queue>
using namespace std;
typedef long long ll;
//c++
#pragma comment(linker, "/STACK:102400000,102400000")
// g++
//int size = 256 << 20; // 256MB
//char *p = (char*)malloc(size) + size;
//__asm__("movl %0, %esp\n" :: "r"(p) );
#define sf(a) scanf("%d",&a)
#define sfs(a) scanf("%s",a)
#define sfI(a) scanf("%I64d",&a)
#define pf(a) printf("%d\n",a)
#define pfI(a) printf("%I64d\n",a)
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define repd(i,a,b) for(int i=(a);i>=(b);i--)
#define rep1(i,a,b) for(int i=(a);i<(b);i++)
#define clr(a) memset(a,0,sizeof(a))
#define clr1(a) memset(a,-1,sizeof(a))
#define pfk printf("fuck\n")
/* define */
/* clock */
//clock_t start, finish;
//start = clock();
//finish = clock();
//double duration = (double)(finish - start)/CLOCKS_PER_SEC;
//printf( "%.10f seconds\n", duration );
/* clock */
/* data */
/* data */
int gcd(int a,int b){
return b==0?a:gcd(b,a%b);
}
string str1,str2;
//int d1[2000000][30];
int d2[1000010][30];
int main(){
ll n,m;
cin>>n>>m;
cin>>str1;
cin>>str2;
int len1=str1.length();
int len2=str2.length();
int g=gcd(len1,len2);
ll lcm=(ll)len1/g*len2;
//for(int i=0;str1[i];i++){
// d1[i%g][str1[i]-'a']++;
//}
for(int i=0;str2[i];i++){
d2[i%g][str2[i]-'a']++;
}
ll ans=0;
for(int i=0;str1[i];i++){
int id=str1[i]-'a';
for(int j=0;j<26;j++){
if(j==id) continue;
ans+=d2[i%g][j];
}
}
ans*=n*len1/lcm;
cout<<ans<<endl;
return 0;
}