【bzoj 3309 】 DZY Loves Math
Description
对于正整数n,定义f(n)为n所含质因子的最大幂指数。例如f(1960)=f(2^3 * 5^1 * 7^2)=3, f(10007)=1, f(1)=0。
给定正整数a,b,求sigma(sigma(f(gcd(i,j)))) (i=1..a, j=1..b)。
Input
第一行一个数T,表示询问数。
接下来T行,每行两个数a,b,表示一个询问。
Output
对于每一个询问,输出一行一个非负整数作为回答。
Sample Input
4
7558588 9653114
6514903 4451211
7425644 1189442
6335198 4957
7558588 9653114
6514903 4451211
7425644 1189442
6335198 4957
Sample Output
35793453939901
14225956593420
4332838845846
15400094813
14225956593420
4332838845846
15400094813
HINT
【数据规模】
T<=10000
1<=a,b<=10^7
题解:
O(≧口≦)O,不想写了……打一次数学公式半个多小时2333
贴一发题解:http://www.cnblogs.com/xkui/p/4598596.html
#include<cstdio> using namespace std; typedef long long ll; inline ll min(ll a,ll b){return a<b?a:b;} const ll mod=(ll)1e9+7; const int N=(int)1e7+1; ll n,m,k; int prime[N];int num; bool vis[N]; ll g[N]; int last[N],t[N]; void init(){ for(int i=2;i<N;i++){ if(!vis[i]){ prime[++num]=i; last[i]=t[i]=1; g[i]=1; } for(int j=1;i*prime[j]<N&&j<=num;j++){ int x=i*prime[j]; vis[x]=1; if(i%prime[j]==0){ last[x]=last[i]; t[x]=t[i]+1; if(last[x]==1) g[x]=1; else g[x]=(t[last[x]]==t[x]?-g[last[x]]:0); break; } last[x]=i; t[x]=1; g[x]=(t[i]==1?-g[i]:0); } } for(int i=2;i<N;i++) g[i]+=g[i-1]; } inline ll solve(){ ll ans=0; if(m<n) n^=m^=n^=m; ll last; for(ll i=1;i<=n;i=last+1){ last=min(n/(n/i),m/(m/i)); ans+=(n/i)*(m/i)*(g[last]-g[i-1]); } return ans; } int main(){ int T; scanf("%ld",&T); init(); while(T--){ scanf("%lld%lld",&n,&m); ll ans=solve(); printf("%lld\n",ans); } }
没有什么不可能。