51Nod 1352 集合计数
2016-12-14 19:33
162 查看
给出N个固定集合{1,N},{2,N-1},{3,N-2},...,{N-1,2},{N,1}.求出有多少个集合满足:第一个元素是A的倍数且第二个元素是B的倍数。
提示:
对于第二组测试数据,集合分别是:{1,10},{2,9},{3,8},{4,7},{5,6},{6,5},{7,4},{8,3},{9,2},{10,1}.满足条件的是第2个和第8个。
Input
Output
Input示例
Output示例
提示:
对于第二组测试数据,集合分别是:{1,10},{2,9},{3,8},{4,7},{5,6},{6,5},{7,4},{8,3},{9,2},{10,1}.满足条件的是第2个和第8个。
Input
第1行:1个整数T(1<=T<=50000),表示有多少组测试数据。 第2 - T+1行:每行三个整数N,A,B(1<=N,A,B<=2147483647)
Output
对于每组测试数据输出一个数表示满足条件的集合的数量,占一行。
Input示例
2 5 2 4 10 2 3
Output示例
1 2
#include <stdio.h> #include <string.h> typedef long long LL; using namespace std; LL exgcd(LL a, LL b, LL &x, LL &y) { LL r,t; if(b==0) { x=1; y=0; return a; } r=exgcd(b,a%b,x,y); t=x; x=y; y=t-a/b*y; return r; } int main() { int t; scanf("%d", &t); while(t--) { LL ans = 0; LL n, a, b; LL x,y,d,r; scanf("%lld%lld%lld",&n, &a, &b); d = exgcd(a, b, x, y); if((n + 1)%d != 0) ans = 0; else { LL LCM = a* b / d; x = x *(((n + 1) % b) / d); r = b / d; x =(x % r + r) % r; //满足方程的最小的x if(x == 0) { x = LCM / a; } if(x * a > n) { ans = 0; printf("%lld\n", ans); continue; } ans = ((n - x*a) / LCM); ans++; } printf("%I64d\n", ans); } return 0; }
相关文章推荐
- 集合计数 51Nod - 1352 扩展gcd
- 51nod 1352 集合计数
- 51nod 1352 集合计数 扩展欧几里得
- 51nod 1352:集合计数
- 51nod 1352:集合计数
- 51nod 1352 集合计数 扩展欧几里得
- 51Nod 1352 集合计数 (扩展欧几里得求方程解的个数)
- 51nod 1352 集合计数 (扩展欧几里得)
- 51nod 1352 集合计数(扩展欧几里得)
- 51nod 1352 扩展欧几里得解不定方程
- 51Nod 1352
- 51NOD 1352 集合计数(扩展欧几里得)
- 1352 集合计数 扩展欧几里德算法
- 51Nod - 1352 拓展gcd
- 51 Nod 1352 集合计数
- 51nod 1352 扩展欧几里德
- 1352 集合计数(求解的个数)
- 51nod 1352 集合计数(扩展欧几里德)
- 51nod 1352 集合计数(扩展欧几里得)
- 51nod-斜率小于0的连线数量(树状数组+离散化)