#include #include #include #include #include #include #include #include #include #include #include #include #include #include #pragma warning(disable:4996) typedef long long ll; #define MIN(a, b) ((a)>(b)? (b): (a)) #define MAX(a, b) ((a)<(b)? (b): (a)) #define LINF 9223300000000000000 #define INF 2140000000 ll MOD; //const long long MOD = 1000000007; //const long long MOD = 998244353; using namespace std; vector pp; void preparePrime( int maxp ) { int i; vector a(maxp+1); for(i=2; i<=maxp; i++) { int k=i+i; while(k<=maxp) { a[k]=1; k+=i; } } for(i=2; i<=maxp; i++) { if(a[i]==0) pp.push_back( i ); } return; } void decompositPrime( ll a, vector >& vv ) { preparePrime( (int)sqrt((double)a)+1 ); int i; for(i=0; i<(int)pp.size(); i++) { int count = 0; while(a % pp[i] == 0 ) { a /= pp[i]; count ++; } if(count>0) vv.push_back( make_pair( pp[i], count ) ); if (a==1) break; } if(a>1) { vv.push_back( make_pair( a, 1 ) ); } return; } char str[5]; void solve() { int n,m,K; scanf("%d%d%d", &n, &m, &K); scanf("%s", str); int flag=(str[0]=='+'? 0: 1); vector a(n),b(m); int i,j; for(i=0; i > z; for(i=0; isecond.first, b=it->second.second; ans+=(ll)a*b; } printf("%lld\n", ans); } else { vector > vv; decompositPrime( K, vv ); int siz=(int)vv.size(); int k; map, int> mp0, mp1; for(i=0; i now; for(k=0; k0 && curr%p==0 && cnt<=q) { cnt++; curr/=p; } now.push_back(cnt); } mp0[now]++; } for(i=0; i now; for(k=0; k0 && curr%p==0 && cnt<=q) { cnt++; curr/=p; } now.push_back(cnt); } mp1[now]++; } ll ans=0; auto it0=mp0.begin(); for(; it0!=mp0.end(); ++it0) { auto it1=mp1.begin(); for(; it1!=mp1.end(); ++it1) { const vector& v0=it0->first; const vector& v1=it1->first; int siz0=(int)v0.size(), siz1=(int)v1.size(); assert(siz0==siz && siz1==siz); for(k=0; ksecond) * (it1->second); } } } printf("%lld\n", ans); } return; } int main(int argc, char* argv[]) { #if 1 solve(); #else int T; scanf("%d", &T); while(T--) { solve(); } #endif return 0; }