HDU5597/BestCoder Round #66 (div.2) GTW likes function 打表欧拉函数

时间:2021-04-11 16:30:05

GTW likes function

 
 
 Memory Limit: 131072/131072 K (Java/Others)
问题描述
现在给出下列两个定义:
f(x)=f_{0}(x)=\sum_{k=0}^{x}(-1)^{k}2^{2x-2k}C_{2x-k+1}^{k},f_{n}(x)=f(f_{n-1}(x))(n\geq 1)f(x)=f​0​​(x)=∑​k=0​x​​(−1)​k​​2​2x−2k​​C​2x−k+1​k​​,f​n​​(x)=f(f​n−1​​(x))(n≥1) \varphi(n)φ(n)为欧拉函数。指的是不超过nn的与nn互质的正整数个数。 对于每组数据,GTW有两个正整数n,xn,x,现在他想知道函数\varphi(f_{n}(x))φ(f​n​​(x))的值。
输入描述
输入有多组数据,不超过100组。每数据输入一行包含2个整数组nn和xx。(1\leq n,x \leq 10^{12})(1≤n,x≤10​12​​)
输出描述
对于每组数据输出一行,表示函数\varphi(f_{n}(x))φ(f​n​​(x))的值。
输入样例
1 1
2 1
3 2
输出样例
2
2
2

题解:按照给出的公式打表,你就会发现其实就是求 n+1+x的欧拉函数值,写个欧拉函数就好了,注意是long long

//meek///#include<bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <stack>
#include <sstream>
#include <vector>
using namespace std ;
#define mem(a) memset(a,0,sizeof(a))
#define pb push_back
#define fi first
#define se second
#define MP make_pair
typedef long long ll; const int N=+;
const int inf = ;
const int mod= ; ll phi(ll n)
{
ll res=n;
for(ll i=;i*i<=n;i++)
{
if(n%i==)
{
res=res-res/i;
while(n%i==)
n/=i;
}
}
if(n>)
res=res-res/n; //可能还有大于sqrt(n)的素因子
return res;
}
int main() { ll n,x;
while(scanf("%I64d%I64d",&n,&x)!=EOF) {
int ans=;
cout<<phi(x+n+)<<endl;
}
return ;
}

代码