HDU|HDU 5528 Count a * b(积性函数)

Description
令f(m)=| { (a,b) | a * b % m != 0,0<=a< m,0<=b< m } |,求HDU|HDU 5528 Count a * b(积性函数)
文章图片

Input
第一行为一整数T表示用例组数,每组用例占一行为一整数n
(1<=T<=20000,1<=n<=10^9)
Output
对于每组用例,输出g(n),结果模2^64
Sample Input
2
6
514
Sample Output
26
328194
Solution
令h(m)=|{(a,b)|a*b%m=0,0<=a< m,0<=b< m}|,则
HDU|HDU 5528 Count a * b(积性函数)
文章图片

问题转化为求n的因子数以及因子平方和,而这两个都是积性函数,对n一遍素因子分解即可得到答案HDU|HDU 5528 Count a * b(积性函数)
文章图片

Code

#include #include #include #include #include #include using namespace std; #define maxn 33333 typedef long long ll; typedef unsigned long long ull; typedef pair P; vector【HDU|HDU 5528 Count a * b(积性函数)】vec; int prime[maxn],is_prime[maxn],res; void get_prime(int n) { res=0; memset(is_prime,0,sizeof(is_prime)); for(int i=2; i1)vec.push_back(make_pair(n,1)); } void solve(int n) { ull ans1=1,ans2=1; for(int i=0; i

    推荐阅读