I think everybody must be having same problem in Problem D having time limit exceeded on Test case 15. The time limit is too strict for the problem. I am tired of optimizing it further now and I have seen exactly same logic being accepted. I am tired and frustrated now. Somebody pls tell how to optimize it from here on.
Here is my Code:
#pragma GCC optimize("Ofast")
#pragma GCC target("avx,avx2,fma")
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std; using namespace __gnu_pbds;
typedef tree<int, null_type, less_equal, rb_tree_tag, tree_order_statistics_node_update> ordered_set;
const int MAX_N = 1e5 + 5; const int MAX_L = 20; // ~ Log N const long long MOD = 1e9 + 7; const long long INF = 1e9 + 7;
typedef long long ll; typedef vector vi; typedef pair<int,int> ii; typedef vector vii; typedef vector vvi;
#define fi first
#define popcount(x) __builtin_popcountll(x)
#define se second
#define LSOne(S) (S & (-S))
#define isBitSet(S, i) ((S >> i) & 1)
const int MAXN=2e7+10;
ll spf[MAXN];
void sieve() { spf[1] = 1; for (int i=2; i<MAXN; i++)
spf[i] = i; for (int i=4; i<MAXN; i+=2) spf[i] = 2; for (int i=3; i*i<MAXN; i++) { if (spf[i] == i) { for (int j=i*i; j<MAXN; j+=i) if (spf[j]==j) spf[j] = i; } }
} long long binpow(long long a, long long b) {
long long res = 1; while (b > 0) { if (b & 1) res = res * a ; a = a * a ; b >>= 1; } res=res; return res;
} ll p2[35]; ll getFactorization(ll x) { //vector ret; map<ll,ll>bo; ll sz=0; while (x != 1) { if(bo[spf[x]]==0){ sz++; bo[spf[x]]=1; } //ret.push_back(spf[x]); x = x / spf[x]; }
return sz;
} ll f(ll num){ ll req=getFactorization(num); //ll l=req.size(); return p2[req] ; }
void solve() { ll c,d,n; cin>>c>>d>>n; ll ans=0; //map<ll,ll>mp; for(ll j=1;j*j<=n;j++){ if(n%j==0){ ll p1=j; ll p2=n/j; ll r1=n/p1 +d; ll r2=n/p2+d; if(r1%c==0){ ans+=f(r1/c);
} if(r1!=r2){ if(r2%c==0){ ans+=f(r2/c); } } }
} cout<<ans<<endl;
}
int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#ifdef LOCAL freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout); #endif sieve(); ll pj=1; for(ll i=0;i<=34;i++){ p2[i]=pj; pj=pj*2; } int tc; cin >> tc; for (int t = 1; t <= tc; t++) { //cout << "Case #" << t << ": "; solve(); }
}