51nod-1262 扔球(欧拉函数)

来源:互联网 发布:使用excel制作数据库 编辑:程序博客网 时间:2024/05/01 03:32

原题链接

1262 扔球
基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题
 收藏
 关注
在圆上一点S,扔出一个球,这个球经过若干次反弹还有可能回到S点。N = 4时,有4种扔法,如图:

恰好经过4次反弹回到起点S(从S到T1,以及反向,共4种)。
给出一个数N,求有多少种不同的扔法,使得球恰好经过N次反弹,回到原点,并且在第N次反弹之前,球从未经过S点。
Input
输入一个数N(1 <= N <= 10^9)。
Output
输出方案数量。
Input示例
4
Output示例
4
对于每种扔球,球相对于圆心转过的角度为k = 360 / (n + 1) * m, k * (n + 1)是360的倍数,还要满足在k, 2*k, 3*k到n*k是都不存在360的倍数,直到k*(n+1)(因为第N次反弹之前,球从未经过S点),那么m和(n+1)必须互质,所以答案就是n+1的欧拉函数值

#include <cstdio>#include <cmath>#include <iostream>#include <vector>#include <algorithm>#include <cstring>#define MOD 1000000007#define maxn 100005using namespace std;typedef long long ll;int main(){ll n;scanf("%I64d", &n);n++;ll ans = n;for(ll i = 2; i * i <= n; i++){if(n % i == 0){ans = ans / i * (i - 1);while(n % i == 0) n /= i;}}if(n != 1){ans = ans / n * (n - 1);}printf("%I64d\n", ans);return 0;} 



0 0