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)=f0(x)=∑k=0x(−1)k22x−2kC2x−k+1k,fn(x)=f(fn−1(x))(n≥1)
\varphi(n)φ(n)为欧拉函数。指的是不超过nn的与nn互质的正整数个数。
对于每组数据,GTW有两个正整数n,xn,x,现在他想知道函数\varphi(f_{n}(x))φ(fn(x))的值。
输入描述
输入有多组数据,不超过100组。每数据输入一行包含2个整数组nn和xx。(1\leq n,x \leq 10^{12})(1≤n,x≤1012)
输出描述
对于每组数据输出一行,表示函数\varphi(f_{n}(x))φ(fn(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=1005000+100;
const int inf = 99999999;
const int mod= 1000000007;
ll phi(ll n)
{
ll res=n;
for(ll i=2;i*i<=n;i++)
{
if(n%i==0)
{
res=res-res/i;
while(n%i==0)
n/=i;
}
}
if(n>1)
res=res-res/n; //可能还有大于sqrt(n)的素因子
return res;
}
int main() {
ll n,x;
while(scanf("%I64d%I64d",&n,&x)!=EOF) {
int ans=0;
cout<<phi(x+n+1)<<endl;
}
return 0;
}