HDU——5528 Count a * b(积性函数推公式+唯一分解定理)

Marry likes to count the number of ways to choose two non-negative integers aa and bbless than mm to make a×ba×b mod m≠0m≠0. 

Let's denote f(m)f(m) as the number of ways to choose two non-negative integers aa and bbless than mm to make a×ba×b mod m≠0m≠0. 

She has calculated a lot of f(m)f(m) for different mm, and now she is interested in another function g(n)=∑m|nf(m)g(n)=∑m|nf(m). For example, g(6)=f(1)+f(2)+f(3)+f(6)=0+1+4+21=26g(6)=f(1)+f(2)+f(3)+f(6)=0+1+4+21=26. She needs you to double check the answer. 



Give you nn. Your task is to find g(n)g(n) modulo 264264.

Input

The first line contains an integer TT indicating the total number of test cases. Each test case is a line with a positive integer nn. 

1≤T≤200001≤T≤20000 
1≤n≤1091≤n≤109

Output

For each test case, print one integer ss, representing g(n)g(n) modulo 264264.

Sample Input

2
6
514

Sample Output

26
328194

题意:求  (|是整除,(!|)是不整除,因为不会弄这个符号)  括号(断言)里的意思是,如果i*j%x==0 返回0,否则返回1

题解:推导公式:我写了纸上了~~

请看:

化简f(m):

 

化简g(n):

上代码:

#include <iostream>
#include <cstdio>
using namespace std;
typedef long long ll;
const int MAX = 1e5+10;
ll p[MAX];
bool vis[MAX];
int cnt;
void init(){//筛素数
	vis[1]=vis[0]=1;
	for (int i = 2; i < MAX;i++){
		if(!vis[i]) p[cnt++]=i;
		for (int j = 0; j < cnt&&i*p[j] < MAX;j++){
			vis[i*p[j]]=1;
			if(i%p[j]==0) break;
		}
	} 
}
int main(){
	init();
	int t;
	scanf("%d",&t);
	while(t--){
		ll n;
		scanf("%lld",&n);
		ll ans1,ans2;
		ans1=ans2=1;
		ll w=n;
		for (int i = 0; p[i]*p[i]<=n;i++){//唯一分解定理
			ll a,b,c;
			a=b=c=1;
			while(n%p[i]==0){
				a++;
				b*=p[i];
				n/=p[i];
				c+=b*b;
			}
			ans1*=c;
			ans2*=a;
		}
		if(n>1){
			ans1*=(n*n+1ll);
			ans2*=2;
		}
		printf("%lld\n",ans1-ans2*w);
	}
	return 0;
} 

 

 

 

全部评论

相关推荐

钱嘛数字而已:拖拉机被发明出来之后,就不需要农民了吗?农民还是需要的,但不需要这么多了,另外对农民的要求也变高了,需要会开拖拉机。
点赞 评论 收藏
分享
合适才能收到offe...:招聘上写这些态度傲慢的就别继续招呼了,你会发现hr和面试官挺神的,本来求职艰难就可能影响一些心态了,你去这种公司面试的话,整个心态会炸的。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务