博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UVA Live 6068
阅读量:4286 次
发布时间:2019-05-27

本文共 2910 字,大约阅读时间需要 9 分钟。

题解:http://vjudge.net/problem/viewProblem.action?id=43952

把<10^6的素数先搞出来,然后枚举每个

对于p
筛掉(a * n + b) % p = 0的
分两种情况
1. a % p = 0 的话,(a * n + b) % p = b % p,
   b % p = 0 的话才能使 (a * n + b) % p = 0 ,然后直接答案为0
2. a % p != 0 的话,先求出最小的n0,使得(a * n0 + b) % p = 0
    然后(a * (n0 + x) + b) % p = (a * x) % p = 0 ,p是素数,所以x 是p的倍数。。。
    然后筛掉n0, n0 + p, n0 + 2 * p....

最后统计下就行了

#include 
#include
#include
using namespace std;// maximum prime trial divisor we need (up to sqrt of max a*U+b)const long long MAX_PRIME = 1000000;// maximum range of values of n to consider (U-L+1)const long long MAX_RANGE = 1000000+1;vector
primes;bool prime[MAX_PRIME+1];long long gcd(long long a, long long b){ if (!b) return a; return gcd(b, a%b);}long long gcd(long long a, long long b, long long &s, long long &t){ long long r, r1, r2, a1, a2, b1, b2, q; a1 = b2 = 1; a2 = b1 = 0; while (b) { q = a / b; r = a % b; r1 = a1 - q*b1; r2 = a2 - q*b2; a = b; a1 = b1; a2 = b2; b = r; b1 = r1; b2 = r2; } s = a1; t = a2; return a;}// generate all primes up to max(sqrt(a*U+b))void genprimes(){ fill(prime, prime+MAX_PRIME+1, true); prime[0] = prime[1] = false; // use a sieve for (long long p = 2; p < MAX_PRIME+1; p++) { if (!prime[p]) continue; primes.push_back(p); for (long long k = p*p; k < MAX_PRIME+1; k += p) { prime[k] = false; } } //cout<
<
> a; if (!a) return false; cin >> b >> L >> U; cout << "Case " << id << ": "; // special case: if gcd(a, b) > 1, then the only potential prime is when // n == 0 and b is prime. if (gcd(a, b) > 1) { if (L == 0 && isprime(b)) { cout << 1 << endl; } else { cout << 0 << endl; } return true; } // gcd(a, b) = 1, do a sieve on range of n bool nprime[MAX_RANGE]; int range = U - L + 1; fill(nprime, nprime + range, true); // special cases // // if a*n+b <= 2 we will have to account for that // // n = 0 (only occurs if L = 0) // n = 1 (if L <= 1) if (L == 0) { nprime[0] = isprime(b); } if (L <= 1) { nprime[1-L] = isprime(a+b); } long long maxval = a * U + b; for (unsigned int i = 0; i < primes.size(); i++) { long long p = primes[i]; // p cannot divide b since gcd(a,b) = 1 if (a % p == 0) continue; // p cannot divide more a*n+b if (p*p > maxval) break; // solve for n in a*n+b = 0 mod p long long s, t; gcd(a, p, s, t); int n_start = (-(b*s)) %p; if (n_start < 0) n_start += p; int Lrem = L % p; n_start -= Lrem; if (n_start < 0) n_start += p; // get past the first multiple which is prime! while (a*(n_start + L)+b <= p) { n_start += p; } // finally do the sieve while (n_start < range) { nprime[n_start] = false; n_start += p; } }#ifdef DEBUG for (int i = 0; i < range; i++) { if (nprime[i]) { cout << " " << a*(i+L)+b << endl; } }#endif cout << count(nprime, nprime+range, true) << endl; return true;}int main(){ genprimes(); int id = 1; while (solve(id++)) ; return 0;}

转载地址:http://lbsgi.baihongyu.com/

你可能感兴趣的文章
AngularJS动画(一)
查看>>
SqlServer消息 6107,级别 14 只能终止用户进程。
查看>>
ng-if和ng-show的区别
查看>>
ng-if指令
查看>>
ng-switch指令
查看>>
SqlServer2008T-Sql收缩数据库日志文件
查看>>
ng-include指令
查看>>
AngularJS动画(二)
查看>>
.Net编译器Roslyn(一)
查看>>
C# 6.0新特性整理
查看>>
Sublime Text插件之Css3
查看>>
查看当前Git工具的版本
查看>>
AngularJS路由之ui-router(三)
查看>>
Sublime Text插件之HTML-CSS-JS Prettify
查看>>
Sublime Text插件之JavaScript Completions
查看>>
C#编码规范整理
查看>>
C#Nullable<T>可空的值类型,C#中的?使用整理
查看>>
EntityFramework中JSON序列化循环引用----JavaScriptSerializer
查看>>
EntiryFramework中事务操作实例
查看>>
删除github上的远程分支
查看>>